var $hxClasses = $hxClasses || {},$estr = function() { return js.Boot.__string_rec(this,''); };
var EReg = $hxClasses["EReg"] = function(r,opt) {
	opt = opt.split("u").join("");
	this.r = new RegExp(r,opt);
};
EReg.__name__ = ["EReg"];
EReg.prototype = {
	customReplace: function(s,f) {
		var buf = new StringBuf();
		while(true) {
			if(!this.match(s)) break;
			buf.b += Std.string(this.matchedLeft());
			buf.b += Std.string(f(this));
			s = this.matchedRight();
		}
		buf.b += Std.string(s);
		return buf.b;
	}
	,replace: function(s,by) {
		return s.replace(this.r,by);
	}
	,split: function(s) {
		var d = "#__delim__#";
		return s.replace(this.r,d).split(d);
	}
	,matchedPos: function() {
		if(this.r.m == null) throw "No string matched";
		return { pos : this.r.m.index, len : this.r.m[0].length};
	}
	,matchedRight: function() {
		if(this.r.m == null) throw "No string matched";
		var sz = this.r.m.index + this.r.m[0].length;
		return this.r.s.substr(sz,this.r.s.length - sz);
	}
	,matchedLeft: function() {
		if(this.r.m == null) throw "No string matched";
		return this.r.s.substr(0,this.r.m.index);
	}
	,matched: function(n) {
		return this.r.m != null && n >= 0 && n < this.r.m.length?this.r.m[n]:(function($this) {
			var $r;
			throw "EReg::matched";
			return $r;
		}(this));
	}
	,match: function(s) {
		if(this.r.global) this.r.lastIndex = 0;
		this.r.m = this.r.exec(s);
		this.r.s = s;
		return this.r.m != null;
	}
	,r: null
	,__class__: EReg
}
var Hash = $hxClasses["Hash"] = function() {
	this.h = { };
};
Hash.__name__ = ["Hash"];
Hash.prototype = {
	toString: function() {
		var s = new StringBuf();
		s.b += Std.string("{");
		var it = this.keys();
		while( it.hasNext() ) {
			var i = it.next();
			s.b += Std.string(i);
			s.b += Std.string(" => ");
			s.b += Std.string(Std.string(this.get(i)));
			if(it.hasNext()) s.b += Std.string(", ");
		}
		s.b += Std.string("}");
		return s.b;
	}
	,iterator: function() {
		return { ref : this.h, it : this.keys(), hasNext : function() {
			return this.it.hasNext();
		}, next : function() {
			var i = this.it.next();
			return this.ref["$" + i];
		}};
	}
	,keys: function() {
		var a = [];
		for( var key in this.h ) {
		if(this.h.hasOwnProperty(key)) a.push(key.substr(1));
		}
		return HxOverrides.iter(a);
	}
	,remove: function(key) {
		key = "$" + key;
		if(!this.h.hasOwnProperty(key)) return false;
		delete(this.h[key]);
		return true;
	}
	,exists: function(key) {
		return this.h.hasOwnProperty("$" + key);
	}
	,get: function(key) {
		return this.h["$" + key];
	}
	,set: function(key,value) {
		this.h["$" + key] = value;
	}
	,h: null
	,__class__: Hash
}
var HxOverrides = $hxClasses["HxOverrides"] = function() { }
HxOverrides.__name__ = ["HxOverrides"];
HxOverrides.dateStr = function(date) {
	var m = date.getMonth() + 1;
	var d = date.getDate();
	var h = date.getHours();
	var mi = date.getMinutes();
	var s = date.getSeconds();
	return date.getFullYear() + "-" + (m < 10?"0" + m:"" + m) + "-" + (d < 10?"0" + d:"" + d) + " " + (h < 10?"0" + h:"" + h) + ":" + (mi < 10?"0" + mi:"" + mi) + ":" + (s < 10?"0" + s:"" + s);
}
HxOverrides.strDate = function(s) {
	switch(s.length) {
	case 8:
		var k = s.split(":");
		var d = new Date();
		d.setTime(0);
		d.setUTCHours(k[0]);
		d.setUTCMinutes(k[1]);
		d.setUTCSeconds(k[2]);
		return d;
	case 10:
		var k = s.split("-");
		return new Date(k[0],k[1] - 1,k[2],0,0,0);
	case 19:
		var k = s.split(" ");
		var y = k[0].split("-");
		var t = k[1].split(":");
		return new Date(y[0],y[1] - 1,y[2],t[0],t[1],t[2]);
	default:
		throw "Invalid date format : " + s;
	}
}
HxOverrides.cca = function(s,index) {
	var x = s.charCodeAt(index);
	if(x != x) return undefined;
	return x;
}
HxOverrides.substr = function(s,pos,len) {
	if(pos != null && pos != 0 && len != null && len < 0) return "";
	if(len == null) len = s.length;
	if(pos < 0) {
		pos = s.length + pos;
		if(pos < 0) pos = 0;
	} else if(len < 0) len = s.length + len - pos;
	return s.substr(pos,len);
}
HxOverrides.remove = function(a,obj) {
	var i = 0;
	var l = a.length;
	while(i < l) {
		if(a[i] == obj) {
			a.splice(i,1);
			return true;
		}
		i++;
	}
	return false;
}
HxOverrides.iter = function(a) {
	return { cur : 0, arr : a, hasNext : function() {
		return this.cur < this.arr.length;
	}, next : function() {
		return this.arr[this.cur++];
	}};
}
var IntHash = $hxClasses["IntHash"] = function() {
	this.h = { };
};
IntHash.__name__ = ["IntHash"];
IntHash.prototype = {
	toString: function() {
		var s = new StringBuf();
		s.b += Std.string("{");
		var it = this.keys();
		while( it.hasNext() ) {
			var i = it.next();
			s.b += Std.string(i);
			s.b += Std.string(" => ");
			s.b += Std.string(Std.string(this.get(i)));
			if(it.hasNext()) s.b += Std.string(", ");
		}
		s.b += Std.string("}");
		return s.b;
	}
	,iterator: function() {
		return { ref : this.h, it : this.keys(), hasNext : function() {
			return this.it.hasNext();
		}, next : function() {
			var i = this.it.next();
			return this.ref[i];
		}};
	}
	,keys: function() {
		var a = [];
		for( var key in this.h ) {
		if(this.h.hasOwnProperty(key)) a.push(key | 0);
		}
		return HxOverrides.iter(a);
	}
	,remove: function(key) {
		if(!this.h.hasOwnProperty(key)) return false;
		delete(this.h[key]);
		return true;
	}
	,exists: function(key) {
		return this.h.hasOwnProperty(key);
	}
	,get: function(key) {
		return this.h[key];
	}
	,set: function(key,value) {
		this.h[key] = value;
	}
	,h: null
	,__class__: IntHash
}
var IntIter = $hxClasses["IntIter"] = function(min,max) {
	this.min = min;
	this.max = max;
};
IntIter.__name__ = ["IntIter"];
IntIter.prototype = {
	next: function() {
		return this.min++;
	}
	,hasNext: function() {
		return this.min < this.max;
	}
	,max: null
	,min: null
	,__class__: IntIter
}
var List = $hxClasses["List"] = function() {
	this.length = 0;
};
List.__name__ = ["List"];
List.prototype = {
	map: function(f) {
		var b = new List();
		var l = this.h;
		while(l != null) {
			var v = l[0];
			l = l[1];
			b.add(f(v));
		}
		return b;
	}
	,filter: function(f) {
		var l2 = new List();
		var l = this.h;
		while(l != null) {
			var v = l[0];
			l = l[1];
			if(f(v)) l2.add(v);
		}
		return l2;
	}
	,join: function(sep) {
		var s = new StringBuf();
		var first = true;
		var l = this.h;
		while(l != null) {
			if(first) first = false; else s.b += Std.string(sep);
			s.b += Std.string(l[0]);
			l = l[1];
		}
		return s.b;
	}
	,toString: function() {
		var s = new StringBuf();
		var first = true;
		var l = this.h;
		s.b += Std.string("{");
		while(l != null) {
			if(first) first = false; else s.b += Std.string(", ");
			s.b += Std.string(Std.string(l[0]));
			l = l[1];
		}
		s.b += Std.string("}");
		return s.b;
	}
	,iterator: function() {
		return { h : this.h, hasNext : function() {
			return this.h != null;
		}, next : function() {
			if(this.h == null) return null;
			var x = this.h[0];
			this.h = this.h[1];
			return x;
		}};
	}
	,remove: function(v) {
		var prev = null;
		var l = this.h;
		while(l != null) {
			if(l[0] == v) {
				if(prev == null) this.h = l[1]; else prev[1] = l[1];
				if(this.q == l) this.q = prev;
				this.length--;
				return true;
			}
			prev = l;
			l = l[1];
		}
		return false;
	}
	,clear: function() {
		this.h = null;
		this.q = null;
		this.length = 0;
	}
	,isEmpty: function() {
		return this.h == null;
	}
	,pop: function() {
		if(this.h == null) return null;
		var x = this.h[0];
		this.h = this.h[1];
		if(this.h == null) this.q = null;
		this.length--;
		return x;
	}
	,last: function() {
		return this.q == null?null:this.q[0];
	}
	,first: function() {
		return this.h == null?null:this.h[0];
	}
	,push: function(item) {
		var x = [item,this.h];
		this.h = x;
		if(this.q == null) this.q = x;
		this.length++;
	}
	,add: function(item) {
		var x = [item];
		if(this.h == null) this.h = x; else this.q[1] = x;
		this.q = x;
		this.length++;
	}
	,length: null
	,q: null
	,h: null
	,__class__: List
}
var Reflect = $hxClasses["Reflect"] = function() { }
Reflect.__name__ = ["Reflect"];
Reflect.hasField = function(o,field) {
	return Object.prototype.hasOwnProperty.call(o,field);
}
Reflect.field = function(o,field) {
	var v = null;
	try {
		v = o[field];
	} catch( e ) {
	}
	return v;
}
Reflect.setField = function(o,field,value) {
	o[field] = value;
}
Reflect.getProperty = function(o,field) {
	var tmp;
	return o == null?null:o.__properties__ && (tmp = o.__properties__["get_" + field])?o[tmp]():o[field];
}
Reflect.setProperty = function(o,field,value) {
	var tmp;
	if(o.__properties__ && (tmp = o.__properties__["set_" + field])) o[tmp](value); else o[field] = value;
}
Reflect.callMethod = function(o,func,args) {
	return func.apply(o,args);
}
Reflect.fields = function(o) {
	var a = [];
	if(o != null) {
		var hasOwnProperty = Object.prototype.hasOwnProperty;
		for( var f in o ) {
		if(hasOwnProperty.call(o,f)) a.push(f);
		}
	}
	return a;
}
Reflect.isFunction = function(f) {
	return typeof(f) == "function" && !(f.__name__ || f.__ename__);
}
Reflect.compare = function(a,b) {
	return a == b?0:a > b?1:-1;
}
Reflect.compareMethods = function(f1,f2) {
	if(f1 == f2) return true;
	if(!Reflect.isFunction(f1) || !Reflect.isFunction(f2)) return false;
	return f1.scope == f2.scope && f1.method == f2.method && f1.method != null;
}
Reflect.isObject = function(v) {
	if(v == null) return false;
	var t = typeof(v);
	return t == "string" || t == "object" && !v.__enum__ || t == "function" && (v.__name__ || v.__ename__);
}
Reflect.deleteField = function(o,f) {
	if(!Reflect.hasField(o,f)) return false;
	delete(o[f]);
	return true;
}
Reflect.copy = function(o) {
	var o2 = { };
	var _g = 0, _g1 = Reflect.fields(o);
	while(_g < _g1.length) {
		var f = _g1[_g];
		++_g;
		o2[f] = Reflect.field(o,f);
	}
	return o2;
}
Reflect.makeVarArgs = function(f) {
	return function() {
		var a = Array.prototype.slice.call(arguments);
		return f(a);
	};
}
var Std = $hxClasses["Std"] = function() { }
Std.__name__ = ["Std"];
Std["is"] = function(v,t) {
	return js.Boot.__instanceof(v,t);
}
Std.string = function(s) {
	return js.Boot.__string_rec(s,"");
}
Std["int"] = function(x) {
	return x | 0;
}
Std.parseInt = function(x) {
	var v = parseInt(x,10);
	if(v == 0 && (HxOverrides.cca(x,1) == 120 || HxOverrides.cca(x,1) == 88)) v = parseInt(x);
	if(isNaN(v)) return null;
	return v;
}
Std.parseFloat = function(x) {
	return parseFloat(x);
}
Std.random = function(x) {
	return Math.floor(Math.random() * x);
}
var StringBuf = $hxClasses["StringBuf"] = function() {
	this.b = "";
};
StringBuf.__name__ = ["StringBuf"];
StringBuf.prototype = {
	toString: function() {
		return this.b;
	}
	,addSub: function(s,pos,len) {
		this.b += HxOverrides.substr(s,pos,len);
	}
	,addChar: function(c) {
		this.b += String.fromCharCode(c);
	}
	,add: function(x) {
		this.b += Std.string(x);
	}
	,b: null
	,__class__: StringBuf
}
var StringTools = $hxClasses["StringTools"] = function() { }
StringTools.__name__ = ["StringTools"];
StringTools.urlEncode = function(s) {
	return encodeURIComponent(s);
}
StringTools.urlDecode = function(s) {
	return decodeURIComponent(s.split("+").join(" "));
}
StringTools.htmlEscape = function(s) {
	return s.split("&").join("&amp;").split("<").join("&lt;").split(">").join("&gt;");
}
StringTools.htmlUnescape = function(s) {
	return s.split("&gt;").join(">").split("&lt;").join("<").split("&amp;").join("&");
}
StringTools.startsWith = function(s,start) {
	return s.length >= start.length && HxOverrides.substr(s,0,start.length) == start;
}
StringTools.endsWith = function(s,end) {
	var elen = end.length;
	var slen = s.length;
	return slen >= elen && HxOverrides.substr(s,slen - elen,elen) == end;
}
StringTools.isSpace = function(s,pos) {
	var c = HxOverrides.cca(s,pos);
	return c >= 9 && c <= 13 || c == 32;
}
StringTools.ltrim = function(s) {
	var l = s.length;
	var r = 0;
	while(r < l && StringTools.isSpace(s,r)) r++;
	if(r > 0) return HxOverrides.substr(s,r,l - r); else return s;
}
StringTools.rtrim = function(s) {
	var l = s.length;
	var r = 0;
	while(r < l && StringTools.isSpace(s,l - r - 1)) r++;
	if(r > 0) return HxOverrides.substr(s,0,l - r); else return s;
}
StringTools.trim = function(s) {
	return StringTools.ltrim(StringTools.rtrim(s));
}
StringTools.rpad = function(s,c,l) {
	var sl = s.length;
	var cl = c.length;
	while(sl < l) if(l - sl < cl) {
		s += HxOverrides.substr(c,0,l - sl);
		sl = l;
	} else {
		s += c;
		sl += cl;
	}
	return s;
}
StringTools.lpad = function(s,c,l) {
	var ns = "";
	var sl = s.length;
	if(sl >= l) return s;
	var cl = c.length;
	while(sl < l) if(l - sl < cl) {
		ns += HxOverrides.substr(c,0,l - sl);
		sl = l;
	} else {
		ns += c;
		sl += cl;
	}
	return ns + s;
}
StringTools.replace = function(s,sub,by) {
	return s.split(sub).join(by);
}
StringTools.hex = function(n,digits) {
	var s = "";
	var hexChars = "0123456789ABCDEF";
	do {
		s = hexChars.charAt(n & 15) + s;
		n >>>= 4;
	} while(n > 0);
	if(digits != null) while(s.length < digits) s = "0" + s;
	return s;
}
StringTools.fastCodeAt = function(s,index) {
	return s.charCodeAt(index);
}
StringTools.isEOF = function(c) {
	return c != c;
}
var ValueType = $hxClasses["ValueType"] = { __ename__ : ["ValueType"], __constructs__ : ["TNull","TInt","TFloat","TBool","TObject","TFunction","TClass","TEnum","TUnknown"] }
ValueType.TNull = ["TNull",0];
ValueType.TNull.toString = $estr;
ValueType.TNull.__enum__ = ValueType;
ValueType.TInt = ["TInt",1];
ValueType.TInt.toString = $estr;
ValueType.TInt.__enum__ = ValueType;
ValueType.TFloat = ["TFloat",2];
ValueType.TFloat.toString = $estr;
ValueType.TFloat.__enum__ = ValueType;
ValueType.TBool = ["TBool",3];
ValueType.TBool.toString = $estr;
ValueType.TBool.__enum__ = ValueType;
ValueType.TObject = ["TObject",4];
ValueType.TObject.toString = $estr;
ValueType.TObject.__enum__ = ValueType;
ValueType.TFunction = ["TFunction",5];
ValueType.TFunction.toString = $estr;
ValueType.TFunction.__enum__ = ValueType;
ValueType.TClass = function(c) { var $x = ["TClass",6,c]; $x.__enum__ = ValueType; $x.toString = $estr; return $x; }
ValueType.TEnum = function(e) { var $x = ["TEnum",7,e]; $x.__enum__ = ValueType; $x.toString = $estr; return $x; }
ValueType.TUnknown = ["TUnknown",8];
ValueType.TUnknown.toString = $estr;
ValueType.TUnknown.__enum__ = ValueType;
var Type = $hxClasses["Type"] = function() { }
Type.__name__ = ["Type"];
Type.getClass = function(o) {
	if(o == null) return null;
	return o.__class__;
}
Type.getEnum = function(o) {
	if(o == null) return null;
	return o.__enum__;
}
Type.getSuperClass = function(c) {
	return c.__super__;
}
Type.getClassName = function(c) {
	var a = c.__name__;
	return a.join(".");
}
Type.getEnumName = function(e) {
	var a = e.__ename__;
	return a.join(".");
}
Type.resolveClass = function(name) {
	var cl = $hxClasses[name];
	if(cl == null || !cl.__name__) return null;
	return cl;
}
Type.resolveEnum = function(name) {
	var e = $hxClasses[name];
	if(e == null || !e.__ename__) return null;
	return e;
}
Type.createInstance = function(cl,args) {
	switch(args.length) {
	case 0:
		return new cl();
	case 1:
		return new cl(args[0]);
	case 2:
		return new cl(args[0],args[1]);
	case 3:
		return new cl(args[0],args[1],args[2]);
	case 4:
		return new cl(args[0],args[1],args[2],args[3]);
	case 5:
		return new cl(args[0],args[1],args[2],args[3],args[4]);
	case 6:
		return new cl(args[0],args[1],args[2],args[3],args[4],args[5]);
	case 7:
		return new cl(args[0],args[1],args[2],args[3],args[4],args[5],args[6]);
	case 8:
		return new cl(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]);
	default:
		throw "Too many arguments";
	}
	return null;
}
Type.createEmptyInstance = function(cl) {
	function empty() {}; empty.prototype = cl.prototype;
	return new empty();
}
Type.createEnum = function(e,constr,params) {
	var f = Reflect.field(e,constr);
	if(f == null) throw "No such constructor " + constr;
	if(Reflect.isFunction(f)) {
		if(params == null) throw "Constructor " + constr + " need parameters";
		return f.apply(e,params);
	}
	if(params != null && params.length != 0) throw "Constructor " + constr + " does not need parameters";
	return f;
}
Type.createEnumIndex = function(e,index,params) {
	var c = e.__constructs__[index];
	if(c == null) throw index + " is not a valid enum constructor index";
	return Type.createEnum(e,c,params);
}
Type.getInstanceFields = function(c) {
	var a = [];
	for(var i in c.prototype) a.push(i);
	HxOverrides.remove(a,"__class__");
	HxOverrides.remove(a,"__properties__");
	return a;
}
Type.getClassFields = function(c) {
	var a = Reflect.fields(c);
	HxOverrides.remove(a,"__name__");
	HxOverrides.remove(a,"__interfaces__");
	HxOverrides.remove(a,"__properties__");
	HxOverrides.remove(a,"__super__");
	HxOverrides.remove(a,"prototype");
	return a;
}
Type.getEnumConstructs = function(e) {
	var a = e.__constructs__;
	return a.slice();
}
Type["typeof"] = function(v) {
	switch(typeof(v)) {
	case "boolean":
		return ValueType.TBool;
	case "string":
		return ValueType.TClass(String);
	case "number":
		if(Math.ceil(v) == v % 2147483648.0) return ValueType.TInt;
		return ValueType.TFloat;
	case "object":
		if(v == null) return ValueType.TNull;
		var e = v.__enum__;
		if(e != null) return ValueType.TEnum(e);
		var c = v.__class__;
		if(c != null) return ValueType.TClass(c);
		return ValueType.TObject;
	case "function":
		if(v.__name__ || v.__ename__) return ValueType.TObject;
		return ValueType.TFunction;
	case "undefined":
		return ValueType.TNull;
	default:
		return ValueType.TUnknown;
	}
}
Type.enumEq = function(a,b) {
	if(a == b) return true;
	try {
		if(a[0] != b[0]) return false;
		var _g1 = 2, _g = a.length;
		while(_g1 < _g) {
			var i = _g1++;
			if(!Type.enumEq(a[i],b[i])) return false;
		}
		var e = a.__enum__;
		if(e != b.__enum__ || e == null) return false;
	} catch( e ) {
		return false;
	}
	return true;
}
Type.enumConstructor = function(e) {
	return e[0];
}
Type.enumParameters = function(e) {
	return e.slice(2);
}
Type.enumIndex = function(e) {
	return e[1];
}
Type.allEnums = function(e) {
	var all = [];
	var cst = e.__constructs__;
	var _g = 0;
	while(_g < cst.length) {
		var c = cst[_g];
		++_g;
		var v = Reflect.field(e,c);
		if(!Reflect.isFunction(v)) all.push(v);
	}
	return all;
}
var Xml = $hxClasses["Xml"] = function() {
};
Xml.__name__ = ["Xml"];
Xml.Element = null;
Xml.PCData = null;
Xml.CData = null;
Xml.Comment = null;
Xml.DocType = null;
Xml.Prolog = null;
Xml.Document = null;
Xml.parse = function(str) {
	return haxe.xml.Parser.parse(str);
}
Xml.createElement = function(name) {
	var r = new Xml();
	r.nodeType = Xml.Element;
	r._children = new Array();
	r._attributes = new Hash();
	r.setNodeName(name);
	return r;
}
Xml.createPCData = function(data) {
	var r = new Xml();
	r.nodeType = Xml.PCData;
	r.setNodeValue(data);
	return r;
}
Xml.createCData = function(data) {
	var r = new Xml();
	r.nodeType = Xml.CData;
	r.setNodeValue(data);
	return r;
}
Xml.createComment = function(data) {
	var r = new Xml();
	r.nodeType = Xml.Comment;
	r.setNodeValue(data);
	return r;
}
Xml.createDocType = function(data) {
	var r = new Xml();
	r.nodeType = Xml.DocType;
	r.setNodeValue(data);
	return r;
}
Xml.createProlog = function(data) {
	var r = new Xml();
	r.nodeType = Xml.Prolog;
	r.setNodeValue(data);
	return r;
}
Xml.createDocument = function() {
	var r = new Xml();
	r.nodeType = Xml.Document;
	r._children = new Array();
	return r;
}
Xml.prototype = {
	toString: function() {
		if(this.nodeType == Xml.PCData) return this._nodeValue;
		if(this.nodeType == Xml.CData) return "<![CDATA[" + this._nodeValue + "]]>";
		if(this.nodeType == Xml.Comment) return "<!--" + this._nodeValue + "-->";
		if(this.nodeType == Xml.DocType) return "<!DOCTYPE " + this._nodeValue + ">";
		if(this.nodeType == Xml.Prolog) return "<?" + this._nodeValue + "?>";
		var s = new StringBuf();
		if(this.nodeType == Xml.Element) {
			s.b += Std.string("<");
			s.b += Std.string(this._nodeName);
			var $it0 = this._attributes.keys();
			while( $it0.hasNext() ) {
				var k = $it0.next();
				s.b += Std.string(" ");
				s.b += Std.string(k);
				s.b += Std.string("=\"");
				s.b += Std.string(this._attributes.get(k));
				s.b += Std.string("\"");
			}
			if(this._children.length == 0) {
				s.b += Std.string("/>");
				return s.b;
			}
			s.b += Std.string(">");
		}
		var $it1 = this.iterator();
		while( $it1.hasNext() ) {
			var x = $it1.next();
			s.b += Std.string(x.toString());
		}
		if(this.nodeType == Xml.Element) {
			s.b += Std.string("</");
			s.b += Std.string(this._nodeName);
			s.b += Std.string(">");
		}
		return s.b;
	}
	,insertChild: function(x,pos) {
		if(this._children == null) throw "bad nodetype";
		if(x._parent != null) HxOverrides.remove(x._parent._children,x);
		x._parent = this;
		this._children.splice(pos,0,x);
	}
	,removeChild: function(x) {
		if(this._children == null) throw "bad nodetype";
		var b = HxOverrides.remove(this._children,x);
		if(b) x._parent = null;
		return b;
	}
	,addChild: function(x) {
		if(this._children == null) throw "bad nodetype";
		if(x._parent != null) HxOverrides.remove(x._parent._children,x);
		x._parent = this;
		this._children.push(x);
	}
	,firstElement: function() {
		if(this._children == null) throw "bad nodetype";
		var cur = 0;
		var l = this._children.length;
		while(cur < l) {
			var n = this._children[cur];
			if(n.nodeType == Xml.Element) return n;
			cur++;
		}
		return null;
	}
	,firstChild: function() {
		if(this._children == null) throw "bad nodetype";
		return this._children[0];
	}
	,elementsNamed: function(name) {
		if(this._children == null) throw "bad nodetype";
		return { cur : 0, x : this._children, hasNext : function() {
			var k = this.cur;
			var l = this.x.length;
			while(k < l) {
				var n = this.x[k];
				if(n.nodeType == Xml.Element && n._nodeName == name) break;
				k++;
			}
			this.cur = k;
			return k < l;
		}, next : function() {
			var k = this.cur;
			var l = this.x.length;
			while(k < l) {
				var n = this.x[k];
				k++;
				if(n.nodeType == Xml.Element && n._nodeName == name) {
					this.cur = k;
					return n;
				}
			}
			return null;
		}};
	}
	,elements: function() {
		if(this._children == null) throw "bad nodetype";
		return { cur : 0, x : this._children, hasNext : function() {
			var k = this.cur;
			var l = this.x.length;
			while(k < l) {
				if(this.x[k].nodeType == Xml.Element) break;
				k += 1;
			}
			this.cur = k;
			return k < l;
		}, next : function() {
			var k = this.cur;
			var l = this.x.length;
			while(k < l) {
				var n = this.x[k];
				k += 1;
				if(n.nodeType == Xml.Element) {
					this.cur = k;
					return n;
				}
			}
			return null;
		}};
	}
	,iterator: function() {
		if(this._children == null) throw "bad nodetype";
		return { cur : 0, x : this._children, hasNext : function() {
			return this.cur < this.x.length;
		}, next : function() {
			return this.x[this.cur++];
		}};
	}
	,attributes: function() {
		if(this.nodeType != Xml.Element) throw "bad nodeType";
		return this._attributes.keys();
	}
	,exists: function(att) {
		if(this.nodeType != Xml.Element) throw "bad nodeType";
		return this._attributes.exists(att);
	}
	,remove: function(att) {
		if(this.nodeType != Xml.Element) throw "bad nodeType";
		this._attributes.remove(att);
	}
	,set: function(att,value) {
		if(this.nodeType != Xml.Element) throw "bad nodeType";
		this._attributes.set(att,value);
	}
	,get: function(att) {
		if(this.nodeType != Xml.Element) throw "bad nodeType";
		return this._attributes.get(att);
	}
	,getParent: function() {
		return this._parent;
	}
	,setNodeValue: function(v) {
		if(this.nodeType == Xml.Element || this.nodeType == Xml.Document) throw "bad nodeType";
		return this._nodeValue = v;
	}
	,getNodeValue: function() {
		if(this.nodeType == Xml.Element || this.nodeType == Xml.Document) throw "bad nodeType";
		return this._nodeValue;
	}
	,setNodeName: function(n) {
		if(this.nodeType != Xml.Element) throw "bad nodeType";
		return this._nodeName = n;
	}
	,getNodeName: function() {
		if(this.nodeType != Xml.Element) throw "bad nodeType";
		return this._nodeName;
	}
	,_parent: null
	,_children: null
	,_attributes: null
	,_nodeValue: null
	,_nodeName: null
	,parent: null
	,nodeValue: null
	,nodeName: null
	,nodeType: null
	,__class__: Xml
	,__properties__: {set_nodeName:"setNodeName",get_nodeName:"getNodeName",set_nodeValue:"setNodeValue",get_nodeValue:"getNodeValue",get_parent:"getParent"}
}
var com = com || {}
if(!com.wiris) com.wiris = {}
if(!com.wiris.common) com.wiris.common = {}
com.wiris.common.WInteger = $hxClasses["com.wiris.common.WInteger"] = function() { }
com.wiris.common.WInteger.__name__ = ["com","wiris","common","WInteger"];
com.wiris.common.WInteger.max = function(x,y) {
	if(x > y) return x;
	return y;
}
com.wiris.common.WInteger.min = function(x,y) {
	if(x < y) return x;
	return y;
}
com.wiris.common.WInteger.toHex = function(x,digits) {
	var s = "";
	while(x != 0 && digits-- > 0) {
		var d = x & 15;
		s = com.wiris.system.Utf8.uchr(d + (d >= 10?55:48)) + s;
		x = x >> 4;
	}
	while(digits-- > 0) s = "0" + s;
	return s;
}
com.wiris.common.WInteger.parseHex = function(str) {
	return Std.parseInt("0x" + str);
}
com.wiris.common.WInteger.isInteger = function(str) {
	str = StringTools.trim(str);
	var i = 0;
	var n = str.length;
	if(StringTools.startsWith(str,"-")) i++;
	if(StringTools.startsWith(str,"+")) i++;
	var c;
	while(i < n) {
		c = HxOverrides.cca(str,i);
		if(c < 48 || c > 57) return false;
		i++;
	}
	return true;
}
if(!com.wiris.util) com.wiris.util = {}
if(!com.wiris.util.graphics) com.wiris.util.graphics = {}
com.wiris.util.graphics.BoxStyleInterface = $hxClasses["com.wiris.util.graphics.BoxStyleInterface"] = function() { }
com.wiris.util.graphics.BoxStyleInterface.__name__ = ["com","wiris","util","graphics","BoxStyleInterface"];
com.wiris.util.graphics.BoxStyleInterface.prototype = {
	getClassType: null
	,getAlign: null
	,getMaxWidth: null
	,getWidth: null
	,getFlagsMask: null
	,getFlags: null
	,getScriptLevel: null
	,getFontSize: null
	,getFontFamily: null
	,getZoom: null
	,getP: null
	,getLineWidth: null
	,getColor: null
	,isFlag: null
	,isFlagMask: null
	,__class__: com.wiris.util.graphics.BoxStyleInterface
}
if(!com.wiris.editor) com.wiris.editor = {}
com.wiris.editor.BoxStyle = $hxClasses["com.wiris.editor.BoxStyle"] = function() {
	this.p = 0;
	this.scriptLevel = 0;
	this.color = 0;
	this.fontFamily = "inherit";
	this.flags = 0;
	this.flagsMask = 0;
	this.fontSize = 0;
	this.lineWidth = 0;
	this.zoom = 1.0;
	this.align = com.wiris.editor.BoxStyle.AUTO_ALIGN;
	this.classType = "";
};
com.wiris.editor.BoxStyle.__name__ = ["com","wiris","editor","BoxStyle"];
com.wiris.editor.BoxStyle.__interfaces__ = [com.wiris.util.graphics.BoxStyleInterface];
com.wiris.editor.BoxStyle.newFontSizeP = function(p) {
	var s = new com.wiris.editor.BoxStyle();
	s.setP(p);
	return s;
}
com.wiris.editor.BoxStyle.newBoxStyle = function(b0) {
	var b = new com.wiris.editor.BoxStyle();
	b.p = b0.getP();
	b.scriptLevel = b0.getScriptLevel();
	b.fontFamily = b0.getFontFamily();
	b.fontSize = b0.getFontSize();
	b.color = b0.getColor();
	b.flags = b0.getFlags();
	b.flagsMask = b0.getFlagsMask();
	b.lineWidth = b0.getLineWidth();
	b.zoom = b0.getZoom();
	b.width = b0.getWidth();
	b.maxWidth = b0.getMaxWidth();
	b.align = b0.getAlign();
	b.classType = b0.getClassType();
	return b;
}
com.wiris.editor.BoxStyle.join = function(a1,a2) {
	var a = com.wiris.editor.BoxStyle.newBoxStyle(a1);
	a.joinMe(a2);
	return a;
}
com.wiris.editor.BoxStyle.remove = function(a1,a2) {
	var a = com.wiris.editor.BoxStyle.newBoxStyle(a1);
	a.restrict(a2,true);
	return a;
}
com.wiris.editor.BoxStyle.removeEqual = function(a1,a2) {
	var a = com.wiris.editor.BoxStyle.newBoxStyle(a1);
	if(a2.isFlagMask(com.wiris.editor.BoxStyle.COLOR_FLAG) && a1.getColor() == a2.getColor()) a.flagsMask &= ~com.wiris.editor.BoxStyle.COLOR_FLAG;
	if(a2.isFlagMask(com.wiris.editor.BoxStyle.SCRIPT_LEVEL_FLAG) && a1.getScriptLevel() == a2.getScriptLevel()) a.flagsMask &= ~com.wiris.editor.BoxStyle.SCRIPT_LEVEL_FLAG;
	if(a2.isFlagMask(com.wiris.editor.BoxStyle.PROPORTIONAL_SIZE_FLAG) && a1.getP() == a2.getP()) a.flagsMask &= ~com.wiris.editor.BoxStyle.PROPORTIONAL_SIZE_FLAG;
	if(a2.isFlagMask(com.wiris.editor.BoxStyle.ZOOM_FLAG) && a1.getZoom() == a2.getZoom()) a.flagsMask &= ~com.wiris.editor.BoxStyle.ZOOM_FLAG;
	if(a2.isFlagMask(com.wiris.editor.BoxStyle.WIDTH_FLAG) && com.wiris.editor.BoxStyle.equalStrings(a1.getWidth(),a2.getWidth())) a.flagsMask &= ~com.wiris.editor.BoxStyle.WIDTH_FLAG;
	if(a2.isFlagMask(com.wiris.editor.BoxStyle.LINE_WIDTH_FLAG) && a1.getLineWidth() == a2.getLineWidth()) a.flagsMask &= ~com.wiris.editor.BoxStyle.LINE_WIDTH_FLAG;
	if(a2.isFlagMask(com.wiris.editor.BoxStyle.PIXELS_SIZE_FLAG) && a1.getFontSize() == a2.getFontSize()) a.flagsMask &= ~com.wiris.editor.BoxStyle.PIXELS_SIZE_FLAG;
	if(a2.isFlagMask(com.wiris.editor.BoxStyle.MAX_WIDTH_FLAG) && com.wiris.editor.BoxStyle.equalStrings(a1.getMaxWidth(),a2.getMaxWidth())) a.flagsMask &= ~com.wiris.editor.BoxStyle.MAX_WIDTH_FLAG;
	if(a2.isFlagMask(com.wiris.editor.BoxStyle.ALIGN_FLAG) && a1.getAlign() == a2.getAlign()) a.flagsMask &= ~com.wiris.editor.BoxStyle.ALIGN_FLAG;
	if(a2.isFlagMask(com.wiris.editor.BoxStyle.FONT_FAMILY_FLAG) && com.wiris.editor.BoxStyle.equalStrings(a1.getFontFamily(),a2.getFontFamily())) a.flagsMask &= ~com.wiris.editor.BoxStyle.FONT_FAMILY_FLAG;
	if(a2.isFlagMask(com.wiris.editor.BoxStyle.CLASSTYPE_FLAG) && com.wiris.editor.BoxStyle.equalStrings(a1.getClassType(),a2.getClassType())) a.flagsMask &= ~com.wiris.editor.BoxStyle.CLASSTYPE_FLAG;
	a.flagsMask &= ~(a2.getFlagsMask() & ~(a1.getFlags() ^ a2.getFlags()) & (com.wiris.editor.BoxStyle.ITALIC_FLAG | com.wiris.editor.BoxStyle.BOLD_FLAG | com.wiris.editor.BoxStyle.MTEXT_FLAG | com.wiris.editor.BoxStyle.INVISIBLE_FLAG | com.wiris.editor.BoxStyle.RTL_FLAG | com.wiris.editor.BoxStyle.FORCED_LIGATURE_FLAG));
	a.normalizeMask();
	return a;
}
com.wiris.editor.BoxStyle.copyFlags = function(flagsDest,flagsSrc,flagsMask) {
	flagsDest &= ~flagsMask;
	flagsDest |= flagsSrc;
	return flagsDest;
}
com.wiris.editor.BoxStyle.getParams = function(style) {
	var h = new Hash();
	if(style.isFlagMask(com.wiris.editor.BoxStyle.FONT_FAMILY_FLAG)) h.set("fontFamily",style.getFontFamily());
	if(style.isFlagMask(com.wiris.editor.BoxStyle.WIDTH_FLAG)) h.set("width",style.getWidth());
	if(style.isFlagMask(com.wiris.editor.BoxStyle.MAX_WIDTH_FLAG)) h.set("maxWidth",style.getMaxWidth());
	return h;
}
com.wiris.editor.BoxStyle.equalStrings = function(s1,s2) {
	return s1 == s2 || s1 != null && s1 == s2;
}
com.wiris.editor.BoxStyle.alignToString = function(align) {
	if(align == com.wiris.editor.BoxStyle.RIGHT_ALIGN) return "right";
	if(align == com.wiris.editor.BoxStyle.LEFT_ALIGN) return "left";
	if(align == com.wiris.editor.BoxStyle.CENTER_ALIGN) return "center";
	if(align == com.wiris.editor.BoxStyle.DECIMAL_ALIGN) return "decimal";
	if(align == com.wiris.editor.BoxStyle.RELATION_ALIGN) return "relation";
	return "auto";
}
com.wiris.editor.BoxStyle.stringToAlign = function(s) {
	if(s == "right") return com.wiris.editor.BoxStyle.RIGHT_ALIGN;
	if(s == "left") return com.wiris.editor.BoxStyle.LEFT_ALIGN;
	if(s == "center") return com.wiris.editor.BoxStyle.CENTER_ALIGN;
	if(s == "decimal") return com.wiris.editor.BoxStyle.DECIMAL_ALIGN;
	if(s == "relation") return com.wiris.editor.BoxStyle.RELATION_ALIGN;
	return com.wiris.editor.BoxStyle.AUTO_ALIGN;
}
com.wiris.editor.BoxStyle.prototype = {
	setParams: function(parameters) {
		var i = parameters.keys();
		while(i.hasNext()) {
			var key = i.next();
			var value = parameters.get(key);
			this.setParam(key,value);
		}
	}
	,setParam: function(key,value) {
		key = key.toLowerCase();
		if("color" == key) this.setColor(com.wiris.util.css.CSSUtils.colorToInt(value)); else if("fontfamily" == key) this.setFontFamily(value); else if("fontsize" == key) {
			if(value.indexOf("%") >= 0) {
				this.setP(com.wiris.util.css.CSSUtils.percentageToFloat(value));
				this.removeFromFlag(com.wiris.editor.BoxStyle.PIXELS_SIZE_FLAG);
			} else this.setFontSize(com.wiris.util.css.CSSUtils.pixelsToInt(value));
		} else if("zoom" == key) this.setZoom(Std.parseFloat(value)); else if("width" == key) this.setWidth(value); else if("maxwidth" == key) this.setMaxWidth(value); else if("fontstyle" == key) this.setFlag(com.wiris.editor.BoxStyle.ITALIC_FLAG,value == "italic"); else if("fontweight" == key) this.setFlag(com.wiris.editor.BoxStyle.BOLD_FLAG,value == "bold"); else if("classtype" == key) this.setClassType(value); else if("textalign" == key) this.setAlign(com.wiris.editor.BoxStyle.stringToAlign(value));
	}
	,getFlagsMask: function() {
		return this.flagsMask;
	}
	,getFlags: function() {
		return this.flags;
	}
	,getAlign: function() {
		return this.align;
	}
	,getMaxWidth: function() {
		return this.maxWidth;
	}
	,setAlign: function(align) {
		this.align = align;
		this.flagsMask |= com.wiris.editor.BoxStyle.ALIGN_FLAG;
	}
	,setMaxWidth: function(maxWidth) {
		this.maxWidth = maxWidth;
		this.flagsMask |= com.wiris.editor.BoxStyle.MAX_WIDTH_FLAG;
	}
	,setWidth: function(width) {
		this.width = width;
		this.flagsMask |= com.wiris.editor.BoxStyle.WIDTH_FLAG;
	}
	,getWidth: function() {
		return this.width;
	}
	,setFontSize: function(size) {
		this.fontSize = size;
		this.flagsMask |= com.wiris.editor.BoxStyle.PIXELS_SIZE_FLAG;
		this.setFlag(com.wiris.editor.BoxStyle.IGNORE_PROPORTIONAL_SIZE_FLAG,true);
	}
	,getFontSize: function() {
		return this.fontSize;
	}
	,setFontFamily: function(fontFamily) {
		this.fontFamily = fontFamily;
		this.flagsMask |= com.wiris.editor.BoxStyle.FONT_FAMILY_FLAG;
	}
	,getFontFamily: function() {
		return this.fontFamily;
	}
	,isFlag: function(flag) {
		return (this.flags & flag & this.flagsMask) != 0;
	}
	,setFlag: function(flag,state) {
		if(state) this.flags |= flag; else this.flags &= ~flag;
		this.flagsMask |= flag;
	}
	,setClassType: function(classType) {
		this.classType = classType;
		this.flagsMask |= com.wiris.editor.BoxStyle.CLASSTYPE_FLAG;
	}
	,getClassType: function() {
		return this.classType;
	}
	,setColor: function(color) {
		this.color = color;
		this.flagsMask |= com.wiris.editor.BoxStyle.COLOR_FLAG;
	}
	,getColor: function() {
		return this.color;
	}
	,setScriptLevel: function(scriptLevel) {
		this.scriptLevel = scriptLevel;
		this.flagsMask |= com.wiris.editor.BoxStyle.SCRIPT_LEVEL_FLAG;
	}
	,getScriptLevel: function() {
		return this.scriptLevel;
	}
	,setLineWidth: function(lw) {
		this.lineWidth = lw;
		this.flagsMask |= com.wiris.editor.BoxStyle.LINE_WIDTH_FLAG;
	}
	,getLineWidth: function() {
		return this.lineWidth;
	}
	,setZoom: function(zoom) {
		this.zoom = zoom;
		this.flagsMask |= com.wiris.editor.BoxStyle.ZOOM_FLAG;
	}
	,getZoom: function() {
		return this.zoom;
	}
	,setP: function(p) {
		this.p = p;
		this.flagsMask |= com.wiris.editor.BoxStyle.PROPORTIONAL_SIZE_FLAG;
	}
	,getP: function() {
		return this.p;
	}
	,isFlagMask: function(flag) {
		return (this.flagsMask & flag) != 0;
	}
	,removeFromFlag: function(flag) {
		this.flagsMask &= ~flag;
		this.normalizeMask();
	}
	,normalizeMask: function() {
		this.flags = this.flags & this.flagsMask;
		if(!this.isFlagMask(com.wiris.editor.BoxStyle.COLOR_FLAG)) this.color = 0;
		if(!this.isFlagMask(com.wiris.editor.BoxStyle.SCRIPT_LEVEL_FLAG)) this.scriptLevel = 0;
		if(!this.isFlagMask(com.wiris.editor.BoxStyle.PROPORTIONAL_SIZE_FLAG)) this.p = 0;
		if(!this.isFlagMask(com.wiris.editor.BoxStyle.ZOOM_FLAG)) this.zoom = 0;
		if(!this.isFlagMask(com.wiris.editor.BoxStyle.WIDTH_FLAG)) this.width = null;
		if(!this.isFlagMask(com.wiris.editor.BoxStyle.LINE_WIDTH_FLAG)) this.lineWidth = 0;
		if(!this.isFlagMask(com.wiris.editor.BoxStyle.PIXELS_SIZE_FLAG)) this.fontSize = 0;
		if(!this.isFlagMask(com.wiris.editor.BoxStyle.MAX_WIDTH_FLAG)) this.maxWidth = null;
		if(!this.isFlagMask(com.wiris.editor.BoxStyle.ALIGN_FLAG)) this.align = com.wiris.editor.BoxStyle.AUTO_ALIGN;
		if(!this.isFlagMask(com.wiris.editor.BoxStyle.FONT_FAMILY_FLAG)) this.fontFamily = "inherit";
		if(!this.isFlagMask(com.wiris.editor.BoxStyle.CLASSTYPE_FLAG)) this.classType = "";
	}
	,restrictMask: function(mask) {
		this.flagsMask &= mask;
		this.normalizeMask();
	}
	,restrict: function(a2,inverse) {
		if(inverse) this.flagsMask &= ~a2.getFlagsMask(); else this.flagsMask &= a2.getFlagsMask();
		this.normalizeMask();
	}
	,joinMe: function(style) {
		if(style.isFlagMask(com.wiris.editor.BoxStyle.COLOR_FLAG)) this.color = style.getColor();
		if(style.isFlagMask(com.wiris.editor.BoxStyle.SCRIPT_LEVEL_FLAG)) this.scriptLevel = style.getScriptLevel();
		if(style.isFlagMask(com.wiris.editor.BoxStyle.PROPORTIONAL_SIZE_FLAG)) this.p = style.getP();
		if(style.isFlagMask(com.wiris.editor.BoxStyle.ZOOM_FLAG)) this.zoom = style.getZoom();
		if(style.isFlagMask(com.wiris.editor.BoxStyle.WIDTH_FLAG)) this.width = style.getWidth();
		if(style.isFlagMask(com.wiris.editor.BoxStyle.LINE_WIDTH_FLAG)) this.lineWidth = style.getLineWidth();
		if(style.isFlagMask(com.wiris.editor.BoxStyle.PIXELS_SIZE_FLAG)) this.fontSize = style.getFontSize();
		if(style.isFlagMask(com.wiris.editor.BoxStyle.FONT_FAMILY_FLAG)) this.fontFamily = style.getFontFamily();
		if(style.isFlagMask(com.wiris.editor.BoxStyle.MAX_WIDTH_FLAG)) this.maxWidth = style.getMaxWidth();
		if(style.isFlagMask(com.wiris.editor.BoxStyle.ALIGN_FLAG)) this.align = style.getAlign();
		if(style.isFlagMask(com.wiris.editor.BoxStyle.CLASSTYPE_FLAG)) this.classType = style.getClassType();
		this.flagsMask |= style.getFlagsMask();
		this.flags = com.wiris.editor.BoxStyle.copyFlags(this.flags,style.getFlags(),style.getFlagsMask());
		var n = style.getFlagsMask() >> com.wiris.editor.BoxStyle.BIT_REMOVE_FLAG;
		if(n != 0) {
			this.flagsMask &= ~n;
			this.flags &= ~n;
			this.flagsMask &= com.wiris.editor.BoxStyle.FIRST_REMOVE_FLAG - 1;
		}
	}
	,cloneStyle: function() {
		return com.wiris.editor.BoxStyle.newBoxStyle(this);
	}
	,equalStyleIgnoringFlags: function(style,ignoredFlags) {
		var flagXor = style.flags ^ this.flags;
		return style.p == this.p && style.scriptLevel == this.scriptLevel && com.wiris.editor.BoxStyle.equalStrings(style.fontFamily,this.fontFamily) && style.fontSize == this.fontSize && style.color == this.color && (flagXor | ignoredFlags) == ignoredFlags && style.flagsMask == this.flagsMask && style.lineWidth == this.lineWidth && style.zoom == this.zoom && com.wiris.editor.BoxStyle.equalStrings(style.width,this.width) && com.wiris.editor.BoxStyle.equalStrings(style.maxWidth,this.maxWidth) && style.align == this.align && com.wiris.editor.BoxStyle.equalStrings(style.classType,this.classType);
	}
	,equalStyle: function(style) {
		return this.equalStyleIgnoringFlags(style,0);
	}
	,classType: null
	,align: null
	,maxWidth: null
	,width: null
	,zoom: null
	,flagsMask: null
	,flags: null
	,fontFamily: null
	,fontSize: null
	,lineWidth: null
	,color: null
	,scriptLevel: null
	,p: null
	,__class__: com.wiris.editor.BoxStyle
}
if(!com.wiris.editor.formula) com.wiris.editor.formula = {}
com.wiris.editor.formula.WCharacter = $hxClasses["com.wiris.editor.formula.WCharacter"] = function() { }
com.wiris.editor.formula.WCharacter.__name__ = ["com","wiris","editor","formula","WCharacter"];
com.wiris.editor.formula.WCharacter.isDigit = function(c) {
	if(48 <= c && c <= 57) return true;
	if(1632 <= c && c <= 1641) return true;
	if(1776 <= c && c <= 1785) return true;
	return false;
}
com.wiris.editor.formula.WCharacter.isIdentifier = function(c) {
	return com.wiris.editor.formula.WCharacter.isLetter(c) || c == 95;
}
com.wiris.editor.formula.WCharacter.isLarge = function(c) {
	return com.wiris.editor.formula.WCharacter.binarySearch(com.wiris.editor.formula.WCharacter.largeOps,c);
}
com.wiris.editor.formula.WCharacter.isVeryLarge = function(c) {
	return com.wiris.editor.formula.WCharacter.binarySearch(com.wiris.editor.formula.WCharacter.veryLargeOps,c);
}
com.wiris.editor.formula.WCharacter.isBinaryOp = function(c) {
	return com.wiris.editor.formula.WCharacter.binarySearch(com.wiris.editor.formula.WCharacter.binaryOps,c);
}
com.wiris.editor.formula.WCharacter.isRelation = function(c) {
	return com.wiris.editor.formula.WCharacter.binarySearch(com.wiris.editor.formula.WCharacter.relations,c);
}
com.wiris.editor.formula.WCharacter.binarySearch = function(v,c) {
	var min = 0;
	var max = v.length - 1;
	do {
		var mid = Math.floor((min + max) / 2);
		var cc = v[mid];
		if(c == cc) return true; else if(c < cc) max = mid - 1; else min = mid + 1;
	} while(min <= max);
	return false;
}
com.wiris.editor.formula.WCharacter.getMirror = function(str) {
	var mirroredStr = "";
	var i = 0;
	while(i < str.length) {
		var c = HxOverrides.cca(str,i);
		var j = 0;
		while(j < com.wiris.editor.formula.WCharacter.mirrorDictionary.length) {
			if(c == com.wiris.editor.formula.WCharacter.mirrorDictionary[j]) {
				c = com.wiris.editor.formula.WCharacter.mirrorDictionary[j + 1];
				break;
			}
			j += 2;
		}
		mirroredStr += com.wiris.system.Utf8.uchr(c);
		++i;
	}
	return mirroredStr;
}
com.wiris.editor.formula.WCharacter.isStretchyLTR = function(c) {
	var i = 0;
	while(i < com.wiris.editor.formula.WCharacter.horizontalLTRStretchyChars.length) {
		if(c == com.wiris.editor.formula.WCharacter.horizontalLTRStretchyChars[i]) return true;
		++i;
	}
	return false;
}
com.wiris.editor.formula.WCharacter.getNegated = function(c) {
	var i = 0;
	while(i < com.wiris.editor.formula.WCharacter.negations.length) {
		if(com.wiris.editor.formula.WCharacter.negations[i] == c) return com.wiris.editor.formula.WCharacter.negations[i + 1];
		i += 2;
	}
	return -1;
}
com.wiris.editor.formula.WCharacter.getNotNegated = function(c) {
	var i = 1;
	while(i < com.wiris.editor.formula.WCharacter.negations.length) {
		if(com.wiris.editor.formula.WCharacter.negations[i] == c) return com.wiris.editor.formula.WCharacter.negations[i - 1];
		i += 2;
	}
	return -1;
}
com.wiris.editor.formula.WCharacter.isLetter = function(c) {
	if(com.wiris.editor.formula.WCharacter.isDigit(c)) return false;
	if(65 <= c && c <= 90) return true;
	if(97 <= c && c <= 122) return true;
	if(192 <= c && c <= 696 && c != 215 && c != 247) return true;
	if(867 <= c && c <= 1521) return true;
	if(1552 <= c && c <= 8188) return true;
	if(c == 8450 || c == 8461 || c == 8469 || c == 8472 || c == 8473 || c == 8474 || c == 8477 || c == 8484) return true;
	if(com.wiris.editor.formula.WCharacter.isChinese(c)) return true;
	return false;
}
com.wiris.editor.formula.WCharacter.isLowerCase = function(c) {
	return c >= 97 && c <= 122 || c >= 224 && c <= 255 || c >= 591 && c >= 659 || c >= 661 && c <= 687 || c >= 940 && c <= 974;
}
com.wiris.editor.formula.WCharacter.isWord = function(c) {
	if(com.wiris.editor.formula.WCharacter.isDevengari(c) || com.wiris.editor.formula.WCharacter.isChinese(c) || com.wiris.editor.formula.WCharacter.isHebrew(c)) return true;
	return false;
}
com.wiris.editor.formula.WCharacter.isArabianString = function(s) {
	var i = s.length - 1;
	while(i >= 0) {
		if(!com.wiris.editor.formula.WCharacter.isArabian(HxOverrides.cca(s,i))) return false;
		--i;
	}
	return true;
}
com.wiris.editor.formula.WCharacter.isArabian = function(c) {
	if(c >= 1536 && c <= 1791 && !com.wiris.editor.formula.WCharacter.isDigit(c)) return true;
	return false;
}
com.wiris.editor.formula.WCharacter.isHebrew = function(c) {
	if(c >= 1424 && c <= 1535) return true;
	return false;
}
com.wiris.editor.formula.WCharacter.isChinese = function(c) {
	if(c >= 13312 && c <= 40959) return true;
	return false;
}
com.wiris.editor.formula.WCharacter.isGreek = function(c) {
	if(c >= 945 && c <= 969) return true; else if(c >= 913 && c <= 937 && c != 930) return true; else if(c == 977 || c == 981 || c == 982) return true;
	return false;
}
com.wiris.editor.formula.WCharacter.isDevengari = function(c) {
	if(c >= 2304 && c < 2431) return true;
	return false;
}
com.wiris.editor.formula.WCharacter.isDevengariString = function(s) {
	var i = s.length - 1;
	while(i >= 0) {
		if(!com.wiris.editor.formula.WCharacter.isDevengari(HxOverrides.cca(s,i))) return false;
		--i;
	}
	return true;
}
com.wiris.editor.formula.WCharacter.isRTL = function(c) {
	if(com.wiris.editor.formula.WCharacter.isHebrew(c) || com.wiris.editor.formula.WCharacter.isArabian(c)) return true;
	return false;
}
com.wiris.editor.formula.WCharacter.isTallLetter = function(c) {
	if(97 <= c && c <= 122 || 945 <= c && c <= 969) return com.wiris.editor.formula.WCharacter.binarySearch(com.wiris.editor.formula.WCharacter.tallLetters,c);
	return true;
}
com.wiris.editor.formula.WCharacter.isLongLetter = function(c) {
	if(97 <= c && c <= 122 || 945 <= c && c <= 969) return com.wiris.editor.formula.WCharacter.binarySearch(com.wiris.editor.formula.WCharacter.longLetters,c); else if(65 <= c && c <= 90) return false;
	return true;
}
com.wiris.editor.formula.WCharacter.isInvisible = function(c) {
	return com.wiris.editor.formula.WCharacter.binarySearch(com.wiris.editor.formula.WCharacter.invisible,c);
}
com.wiris.editor.formula.WCharacter.isHorizontalOperator = function(c) {
	return com.wiris.editor.formula.WCharacter.binarySearch(com.wiris.editor.formula.WCharacter.horizontalOperators,c);
}
com.wiris.editor.formula.WCharacter.latin2Greek = function(l) {
	var index = -1;
	if(l < 100) index = com.wiris.editor.formula.WCharacter.latinLetters.indexOf("@00" + l + "@"); else if(l < 1000) index = com.wiris.editor.formula.WCharacter.latinLetters.indexOf("@0" + l + "@"); else index = com.wiris.editor.formula.WCharacter.latinLetters.indexOf("@" + l + "@");
	if(index != -1) {
		var s = com.wiris.editor.formula.WCharacter.greekLetters.substring(index + 1,index + 5);
		return Std.parseInt(s);
	}
	return l;
}
com.wiris.editor.formula.WCharacter.greek2Latin = function(g) {
	var index = -1;
	if(g < 100) index = com.wiris.editor.formula.WCharacter.greekLetters.indexOf("@00" + g + "@"); else if(g < 1000) index = com.wiris.editor.formula.WCharacter.greekLetters.indexOf("@0" + g + "@"); else index = com.wiris.editor.formula.WCharacter.greekLetters.indexOf("@" + g + "@");
	if(index != -1) {
		var s = com.wiris.editor.formula.WCharacter.latinLetters.substring(index + 1,index + 5);
		return Std.parseInt(s);
	}
	return g;
}
if(!com.wiris.js) com.wiris.js = {}
com.wiris.js.JsBrowserData = $hxClasses["com.wiris.js.JsBrowserData"] = function() {
};
com.wiris.js.JsBrowserData.__name__ = ["com","wiris","js","JsBrowserData"];
com.wiris.js.JsBrowserData.prototype = {
	identity: null
	,versionSearch: null
	,subString: null
	,prop: null
	,string: null
	,__class__: com.wiris.js.JsBrowserData
}
com.wiris.js.JsOSData = $hxClasses["com.wiris.js.JsOSData"] = function() {
};
com.wiris.js.JsOSData.__name__ = ["com","wiris","js","JsOSData"];
com.wiris.js.JsOSData.prototype = {
	identity: null
	,subString: null
	,string: null
	,__class__: com.wiris.js.JsOSData
}
com.wiris.js.JsBrowser = $hxClasses["com.wiris.js.JsBrowser"] = function() {
	this.dataBrowser = new Array();
	this.addBrowser("navigator.userAgent",null,"Chrome",null,"Chrome");
	this.addBrowser("navigator.userAgent",null,"OmniWeb",null,"OmniWeb");
	this.addBrowser("navigator.vendor",null,"Apple","Version","Safari");
	this.addBrowser(null,"window.opera",null,"Version","Opera");
	this.addBrowser("navigator.vendor",null,"iCab",null,"iCab");
	this.addBrowser("navigator.vendor",null,"KDE",null,"Konkeror");
	this.addBrowser("navigator.userAgent",null,"Firefox",null,"Firefox");
	this.addBrowser("navigator.vendor",null,"Camino",null,"Camino");
	this.addBrowser("navigator.userAgent",null,"Netscape",null,"Netscape");
	this.addBrowser("navigator.userAgent",null,"MSIE","MSIE","Explorer");
	this.addBrowser("navigator.userAgent",null,"Gecko","rv","Mozilla");
	this.addBrowser("navigator.userAgent",null,"Mozilla","Mozilla","Netscape");
	this.dataOS = new Array();
	this.addOS("navigator.platform","Win","Windows");
	this.addOS("navigator.platform","Mac","Mac");
	this.addOS("navigator.userAgent","iPhone","iOS");
	this.addOS("navigator.userAgent","iPad","iOS");
	this.addOS("navigator.userAgent","Android","Android");
	this.addOS("navigator.platform","Linux","Linux");
	this.setBrowser();
	this.setOS();
};
com.wiris.js.JsBrowser.__name__ = ["com","wiris","js","JsBrowser"];
com.wiris.js.JsBrowser.prototype = {
	isAndroid: function() {
		return this.os == "Android";
	}
	,isIOS: function() {
		return this.os == "iOS";
	}
	,isFF: function() {
		return this.browser == "Firefox";
	}
	,isSafari: function() {
		return this.browser == "Safari";
	}
	,isChrome: function() {
		return this.browser == "Chrome";
	}
	,isIE: function() {
		return this.browser == "Explorer";
	}
	,getVersion: function() {
		return this.ver;
	}
	,getOS: function() {
		return this.os;
	}
	,getBrowser: function() {
		return this.browser;
	}
	,searchVersion: function(prop,search) {
		var str = js.Boot.__cast(eval(prop) , String);
		var index = str.indexOf(search);
		if(index == -1) return null;
		return "" + Std.parseFloat(HxOverrides.substr(str,index + search.length + 1,null));
	}
	,setOS: function() {
		var i = HxOverrides.iter(this.dataOS);
		while(i.hasNext()) {
			var s = i.next();
			var str = js.Boot.__cast(eval(s.string) , String);
			if(str.indexOf(s.subString) != -1) {
				this.os = s.identity;
				return;
			}
		}
	}
	,setBrowser: function() {
		var i = HxOverrides.iter(this.dataBrowser);
		while(i.hasNext()) {
			var b = i.next();
			if(b.string != null) {
				var obj = eval(b.string);
				if(obj != null) {
					var str = js.Boot.__cast(obj , String);
					if(str.indexOf(b.subString) != -1) {
						this.browser = b.identity;
						this.ver = this.searchVersion("navigator.userAgent",b.versionSearch);
						if(this.ver == null) this.ver = this.searchVersion("navigator.appVersion",b.versionSearch);
						return;
					}
				}
			}
		}
	}
	,addOS: function(string,subString,identity) {
		var s = new com.wiris.js.JsOSData();
		s.string = string;
		s.subString = subString;
		s.identity = identity;
		this.dataOS.push(s);
	}
	,addBrowser: function(string,prop,subString,versionSearch,identity) {
		var b = new com.wiris.js.JsBrowserData();
		b.string = string;
		b.prop = prop;
		b.subString = subString;
		b.versionSearch = versionSearch != null?versionSearch:identity;
		b.identity = identity;
		this.dataBrowser.push(b);
	}
	,os: null
	,ver: null
	,browser: null
	,dataOS: null
	,dataBrowser: null
	,__class__: com.wiris.js.JsBrowser
}
com.wiris.util.graphics.ClientGraphicsContext = $hxClasses["com.wiris.util.graphics.ClientGraphicsContext"] = function() { }
com.wiris.util.graphics.ClientGraphicsContext.__name__ = ["com","wiris","util","graphics","ClientGraphicsContext"];
com.wiris.util.graphics.ClientGraphicsContext.prototype = {
	selects: null
	,fontExists: null
	,fillRect: null
	,drawArc: null
	,getLineWidth: null
	,drawPolyline: null
	,getFonts: null
	,canDisplay: null
	,setStyle: null
	,getMetrics: null
	,endTranslate: null
	,drawLine: null
	,drawVerticalLineWithType: null
	,drawHorizontalLineWithType: null
	,drawVerticalLine: null
	,drawHorizontalLine: null
	,drawText: null
	,beginTranslate: null
	,__class__: com.wiris.util.graphics.ClientGraphicsContext
}
com.wiris.js.JsClientGraphicsContext = $hxClasses["com.wiris.js.JsClientGraphicsContext"] = function(container,resourceLoader,removeChilds) {
	if(removeChilds == null) removeChilds = true;
	com.wiris.js.JsClientGraphicsContext.initialize(resourceLoader);
	this.browser = new com.wiris.js.JsBrowser();
	this.container = container;
	this.metricsCache = new Hash();
	this.originalStyle = com.wiris.editor.BoxStyle.newFontSizeP(100);
	this.repaintNeeded = false;
	this.resourceLoader = resourceLoader;
	this.smallBrackets = false;
	this.style = this.originalStyle;
	this.styleClass = "";
	this.textDimensionsSuffix = "";
	this.x = 0;
	this.y = 0;
	this.firstTranslate = true;
	if(removeChilds) com.wiris.js.JsDOMUtils.removeChildren(this.container);
	this.metricsParent = js.Lib.document.createElement("span");
	this.metricsParent.style.position = "absolute";
	this.metricsParent.style.top = com.wiris.js.JsClientGraphicsContext.HIDDEN_TOP;
	this.metricsParent.style.whiteSpace = "nowrap";
	this.metricsElement = js.Lib.document.createElement("span");
	this.metricsElement.style.position = "fixed";
	this.metricsElement.style.top = com.wiris.js.JsClientGraphicsContext.HIDDEN_TOP;
	this.metricsElement.style.left = "0";
	this.metricsElement.style.margin = "0";
	this.metricsElement.style.padding = "0";
	this.metricsTextNode = js.Lib.document.createTextNode("x");
	this.metricsElement.appendChild(this.metricsTextNode);
	this.metricsImgNode = js.Lib.document.createElement("img");
	this.metricsImgNode.setAttribute("src",this.resourceLoader.getPath("decoration/baseline_mark.png"));
	this.metricsImgNode.style.height = "0";
	this.metricsImgNode.style.width = "0";
	this.metricsElement.appendChild(this.metricsImgNode);
	this.metricsParent.appendChild(this.metricsElement);
	this.container.appendChild(this.metricsParent);
	this.setColor(com.wiris.js.JsClientGraphicsContext.DEFAULT_COLOR);
	this.setFontFamily(com.wiris.js.JsClientGraphicsContext.DEFAULT_FONT_FAMILY);
	this.setFontSize(com.wiris.js.JsClientGraphicsContext.DEFAULT_FONT_SIZE);
};
com.wiris.js.JsClientGraphicsContext.__name__ = ["com","wiris","js","JsClientGraphicsContext"];
com.wiris.js.JsClientGraphicsContext.__interfaces__ = [com.wiris.util.graphics.ClientGraphicsContext];
com.wiris.js.JsClientGraphicsContext.fontList = null;
com.wiris.js.JsClientGraphicsContext.fontClasses = null;
com.wiris.js.JsClientGraphicsContext.specialChars = null;
com.wiris.js.JsClientGraphicsContext.initialize = function(resourceLoader) {
	if(com.wiris.js.JsClientGraphicsContext.specialChars == null) {
		com.wiris.js.JsClientGraphicsContext.specialChars = new Hash();
		com.wiris.js.JsClientGraphicsContext.parseSpecialChars(Xml.parse(resourceLoader.loadResource("characters.xml")));
		com.wiris.js.JsClientGraphicsContext.fontList = new Array();
		com.wiris.js.JsClientGraphicsContext.fontClasses = new Hash();
		com.wiris.js.JsClientGraphicsContext.fontList.push("drawFont");
		com.wiris.js.JsClientGraphicsContext.fontList.push("jsRootFont");
		com.wiris.js.JsClientGraphicsContext.addFont("horizontal","wrs_horizontalChar");
		com.wiris.js.JsClientGraphicsContext.addFont("brack_sm","wrs_specialSmallChar");
		com.wiris.js.JsClientGraphicsContext.addFont("brackets","wrs_specialChar");
		com.wiris.js.JsClientGraphicsContext.addFont("math1_rtl","wrs_mathRTLChar");
		com.wiris.js.JsClientGraphicsContext.addFont("math1","wrs_mathChar");
		com.wiris.js.JsClientGraphicsContext.fontList.push("negationFont");
		com.wiris.js.JsClientGraphicsContext.fontList.push("Arial");
	}
}
com.wiris.js.JsClientGraphicsContext.addFont = function(name,className) {
	com.wiris.js.JsClientGraphicsContext.fontList.push(name);
	com.wiris.js.JsClientGraphicsContext.fontClasses.set(name,className);
}
com.wiris.js.JsClientGraphicsContext.colorToRgb = function(color) {
	var red = color >> 16 & 255;
	var green = color >> 8 & 255;
	var blue = color & 255;
	return "rgb(" + red + "," + green + "," + blue + ")";
}
com.wiris.js.JsClientGraphicsContext.parseSpecialChars = function(node) {
	if("" + Std.string(node.nodeType) == "element" && node.getNodeName() == "char") {
		var charCode = Std.parseInt(node.get("c"));
		var type = node.get("t");
		var key = String.fromCharCode(charCode);
		if(type != null && type.length > 0) key += ":" + type;
		com.wiris.js.JsClientGraphicsContext.specialChars.set(key,true);
	}
	if("" + Std.string(node.nodeType) == "element" || "" + Std.string(node.nodeType) == "document") {
		var i = node.iterator();
		while(i.hasNext()) com.wiris.js.JsClientGraphicsContext.parseSpecialChars(i.next());
	}
}
com.wiris.js.JsClientGraphicsContext.compare = function(s,min) {
	if(s.length == 0) return 0;
	var i = HxOverrides.iter(s);
	var x = i.next();
	while(i.hasNext()) {
		var candidate = i.next();
		if(min) {
			if(candidate < x) x = candidate;
		} else if(candidate > x) x = candidate;
	}
	return x;
}
com.wiris.js.JsClientGraphicsContext.prototype = {
	selects: function(selector) {
		if(selector.length == 0) return true;
		var parts = selector.split("@");
		if(parts.length == 0) return true;
		if(parts[0] != "js") return false;
		if(parts.length > 1) {
			if("@windows@osx@ios@android@linux@*@".indexOf("@" + parts[1] + "@") < 0) return false;
			if(parts[1] == "windows" && this.browser.getOS() != "Windows") return false;
			if(parts[1] == "osx" && this.browser.getOS() != "Mac") return false;
			if(parts[1] == "ios" && this.browser.getOS() != "iOS") return false;
			if(parts[1] == "android" && this.browser.getOS() != "Android") return false;
			if(parts[1] == "linux" && this.browser.getOS() != "Linux") return false;
			if(parts.length > 2) {
				if(this.browser.isIE()) {
					if("@ie@ie7@ie8@ie9@ie10@".indexOf("@" + parts[2] + "@") < 0) return false;
					if(parts[2] == "ie7" && Std.parseInt(this.browser.getVersion()) != 7) return false;
					if(parts[2] == "ie8" && Std.parseInt(this.browser.getVersion()) != 8) return false;
					if(parts[2] == "ie9" && Std.parseInt(this.browser.getVersion()) != 9) return false;
					if(parts[2] == "ie10" && Std.parseInt(this.browser.getVersion()) != 10) return false;
				}
				if(this.browser.isChrome() && parts[2] != "chrome") return false;
				if(this.browser.isFF() && parts[2] != "firefox") return false;
			}
		}
		return true;
	}
	,fontExists: function(fontFamily) {
		return "@Arial@Times New Roman@Courier New@Tahoma@Verdana@".indexOf("@" + fontFamily + "@") >= 0;
	}
	,fillRect: function(x,y,width,height) {
		x += this.x;
		y += this.y;
		var div = js.Lib.document.createElement("span");
		div.style.top = y + "px";
		div.style.left = x + "px";
		div.style.width = width + "px";
		div.style.height = height + "px";
		div.style.background = this.rgbColor;
		div.style.position = "absolute";
		div.style.zIndex = 0;
		this.container.appendChild(div);
	}
	,getFontClassName: function(fontName) {
		if(!com.wiris.js.JsClientGraphicsContext.fontClasses.exists(fontName)) return null;
		return com.wiris.js.JsClientGraphicsContext.fontClasses.get(fontName);
	}
	,drawPolyline: function(x0,y0,px,py,length) {
	}
	,getFonts: function() {
		return com.wiris.js.JsClientGraphicsContext.fontList;
	}
	,canDisplay: function(fontName,character) {
		var text = String.fromCharCode(character);
		if(fontName == "jsRootFont") return character >= com.wiris.editor.formula.WCharacter.ROOT && character <= com.wiris.editor.formula.WCharacter.ROOT_VERTICAL_LINE;
		if(fontName == "a") return com.wiris.js.JsClientGraphicsContext.specialChars.get(text + ":a") != null;
		if(fontName == "math1") return com.wiris.js.JsClientGraphicsContext.specialChars.get(text + ":m") != null;
		if(fontName == "math1_rtl") return com.wiris.js.JsClientGraphicsContext.specialChars.get(text + ":r") != null;
		if(fontName == "horizontal") return com.wiris.js.JsClientGraphicsContext.specialChars.get(text + ":h") != null;
		if(fontName == "brackets") return com.wiris.js.JsClientGraphicsContext.specialChars.get(text + ":b") != null;
		if(fontName == "brack_sm") return com.wiris.js.JsClientGraphicsContext.specialChars.get(text + ":s") != null;
		return this.fontFamily.toLowerCase() == fontName.toLowerCase();
	}
	,getMetrics: function(fontName,text) {
		return this.getTextDimensions(fontName,text,false);
	}
	,drawVML: function(x,y,width,height,code) {
		if(this.rtl && Std.parseInt(this.browser.getVersion()) == 7) x -= width;
		var div = js.Lib.document.createElement("span");
		div.style.left = x - 1 + "px";
		div.style.top = y - 1 + "px";
		div.style.width = width + "px";
		div.style.height = height + "px";
		div.style.position = "absolute";
		div.style.zIndex = 2;
		this.container.appendChild(div);
		div.innerHTML = code;
	}
	,drawSVG: function(x,y,width,height,code) {
		if(this.rtl && !this.browser.isIE()) x -= width;
		var div = js.Lib.document.createElement("span");
		div.style.left = x + "px";
		div.style.top = y + "px";
		div.style.width = width + "px";
		div.style.height = height + "px";
		div.style.position = "absolute";
		div.innerHTML = "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" style=\"position:absolute;z-index:2;\">" + code + "</svg>";
		this.container.appendChild(div);
	}
	,getLineWidth: function() {
		return Math.max(this.style.getLineWidth() * this.style.getZoom() * this.style.getP() / 100,1) | 0;
	}
	,drawArcVML: function(x,y,width,height,startAngle,arcAngle) {
		var code;
		if(arcAngle == 360) {
			var lineWidth = this.getLineWidth();
			width -= lineWidth;
			height -= lineWidth;
			code = "<v:oval xmlns=\"urn:schemas-microsoft-com:vml\" style=\"behavior: url(#default#VML);margin:0;padding:0;display:inline-block;z-index:2;";
			code += "width: " + width + ";";
			code += "height: " + height + ";\" ";
			code += "filled=\"false\" stroke=\"true\" strokecolor=\"" + this.rgbColor + "\" strokeweight=\"" + lineWidth + "px\" />";
		} else {
			var lineWidth = this.getLineWidth();
			var ceiledHalfLineWidth = Math.ceil(lineWidth / 2) | 0;
			if(this.rtl) x -= width - ceiledHalfLineWidth;
			width -= lineWidth;
			height -= lineWidth;
			x += ceiledHalfLineWidth;
			y += ceiledHalfLineWidth;
			startAngle = 90 - (360 + startAngle) % 360;
			var endAngle = startAngle - arcAngle;
			code = "<v:arc xmlns=\"urn:schemas-microsoft-com:vml\" style=\"behavior: url(#default#VML);margin:0;padding:0;display:inline-block;z-index:2;position:absolute;";
			code += "width:" + width + "px;";
			code += "height:" + height + "px;\" ";
			code += "startangle=\"" + startAngle + "\" endangle=\"" + endAngle + "\" filled=\"false\" stroke=\"true\" strokecolor=\"" + this.rgbColor + "\" strokeweight=\"" + lineWidth + "px\" />";
		}
		this.drawVML(this.x + x,this.y + y,width,height,code);
	}
	,drawArcSVG: function(x,y,width,height,startAngle,arcAngle) {
		var code;
		if(arcAngle == 360) {
			var midX = width / 2;
			var midY = height / 2;
			var parsedWidth = width - this.getLineWidth();
			var parsedHeight = height - this.getLineWidth();
			var rx = parsedWidth / 2;
			var ry = parsedHeight / 2;
			code = "<ellipse cx=\"" + midX + "\" cy=\"" + midY + "\" rx=\"" + rx + "\" ry=\"" + ry + "\" style=\"fill:none;stroke:" + this.rgbColor + ";stroke-width:" + this.getLineWidth() + "\" />";
		} else {
			var midX = width / 2;
			var midY = height / 2;
			var parsedWidth = width - this.getLineWidth();
			var parsedHeight = height - this.getLineWidth();
			var rx = parsedWidth / 2;
			var ry = parsedHeight / 2;
			var startX = midX + Math.cos(startAngle * Math.PI / 180.0) * rx;
			var startY = midY + -Math.sin(startAngle * Math.PI / 180.0) * ry;
			var endX = midX + Math.cos((startAngle + arcAngle) * Math.PI / 180.0) * rx;
			var endY = midY + -Math.sin((startAngle + arcAngle) * Math.PI / 180.0) * ry;
			var largeArcFlag = arcAngle > 180?1:0;
			var path = "M" + startX + "," + startY + " ";
			path += "A" + rx + "," + ry + " ";
			path += "0 ";
			path += largeArcFlag + ",";
			path += "0 ";
			path += endX + "," + endY;
			code = "<path d=\"" + path + "\" style=\"stroke:" + this.rgbColor + ";stroke-width:" + this.getLineWidth() + ";fill:none\" />";
		}
		this.drawSVG(this.x + x,this.y + y,width,height,code);
	}
	,drawArc: function(x,y,width,height,startAngle,arcAngle) {
		if(!this.browser.isIE() || Std.parseFloat(this.browser.getVersion()) >= 9) this.drawArcSVG(x,y,width,height,startAngle,arcAngle); else this.drawArcVML(x,y,width,height,startAngle,arcAngle);
	}
	,setComponentColor: function(c) {
		c.style.color = this.rgbColor;
	}
	,standardHeightAndBaseline: function(fontName,text,dim) {
		if(text == "x") return dim;
		var oldStyle = this.getStyle();
		var newStyle = com.wiris.editor.BoxStyle.newFontSizeP(oldStyle.getP());
		if(oldStyle.isFlagMask(com.wiris.editor.BoxStyle.PIXELS_SIZE_FLAG)) newStyle.setFontSize(oldStyle.getFontSize());
		if(oldStyle.isFlagMask(com.wiris.editor.BoxStyle.FONT_FAMILY_FLAG)) newStyle.setFontFamily(oldStyle.getFontFamily());
		if(oldStyle.isFlagMask(com.wiris.editor.BoxStyle.ZOOM_FLAG)) newStyle.setZoom(oldStyle.getZoom());
		this.setStyle(newStyle,newStyle);
		var xDim = this.getTextDimensions(fontName,"x",true);
		this.setStyle(oldStyle,oldStyle);
		return [dim[0],xDim[1],xDim[2]];
	}
	,setStyle: function(style,changed) {
		this.style = style;
		if(changed.isFlagMask(com.wiris.editor.BoxStyle.PIXELS_SIZE_FLAG)) this.setFontSize(changed.getFontSize());
		if(changed.isFlagMask(com.wiris.editor.BoxStyle.COLOR_FLAG)) this.setColor(changed.getColor());
		if(changed.isFlagMask(com.wiris.editor.BoxStyle.FONT_FAMILY_FLAG)) this.setFontFamily(changed.getFontFamily());
		var classes = new Array();
		this.textDimensionsSuffix = "";
		if(style.isFlagMask(com.wiris.editor.BoxStyle.ITALIC_FLAG)) {
			if(style.isFlag(com.wiris.editor.BoxStyle.ITALIC_FLAG)) {
				classes.push("wrs_italic");
				this.textDimensionsSuffix += ":italic";
			} else {
				classes.push("wrs_notItalic");
				this.textDimensionsSuffix += ":notItalic";
			}
		}
		if(style.isFlagMask(com.wiris.editor.BoxStyle.BOLD_FLAG)) {
			if(style.isFlag(com.wiris.editor.BoxStyle.BOLD_FLAG)) {
				classes.push("wrs_bold");
				this.textDimensionsSuffix += ":bold";
			} else {
				classes.push("wrs_notBold");
				this.textDimensionsSuffix += ":notBold";
			}
		}
		if(style.isFlagMask(com.wiris.editor.BoxStyle.FONT_FAMILY_FLAG)) {
			classes.push(this.getFontFamilyClassName(style.getFontFamily()));
			this.textDimensionsSuffix += ":" + style.getFontFamily();
		}
		this.styleClass = classes.join(" ");
	}
	,setMetricsCache: function(metricsCache) {
		if(metricsCache != null) this.metricsCache = metricsCache;
	}
	,getFontSize: function() {
		return this.fontSize;
	}
	,setFontSize: function(fontSize) {
		this.fontSize = fontSize;
	}
	,setFontFamily: function(fontFamily) {
		this.fontFamily = fontFamily;
	}
	,setColor: function(color) {
		this.rgbColor = com.wiris.js.JsClientGraphicsContext.colorToRgb(color);
		this.color = color;
	}
	,setBracketsSmaller: function(b) {
		this.smallBrackets = b;
	}
	,needsRepaint: function() {
		return this.repaintNeeded || !this.areMetricsWellCalculated();
	}
	,loadFonts: function() {
		var aFont = js.Lib.document.createElement("span");
		aFont.className = "wrs_aChar";
		aFont.appendChild(js.Lib.document.createTextNode("a"));
		var mathFont = js.Lib.document.createElement("span");
		mathFont.className = "wrs_mathChar";
		mathFont.appendChild(js.Lib.document.createTextNode("+"));
		var mathRTLFont = js.Lib.document.createElement("span");
		mathRTLFont.className = "wrs_mathRTLChar";
		mathRTLFont.innerHTML = "&#8773;";
		var horizontalFont = js.Lib.document.createElement("span");
		horizontalFont.className = "wrs_horizontalChar";
		horizontalFont.appendChild(js.Lib.document.createTextNode(String.fromCharCode(61952)));
		var specialFont = js.Lib.document.createElement("span");
		specialFont.className = "wrs_specialChar";
		specialFont.appendChild(js.Lib.document.createTextNode(String.fromCharCode(8214)));
		var specialSmallFont = js.Lib.document.createElement("span");
		specialSmallFont.className = "wrs_specialSmallChar";
		specialSmallFont.appendChild(js.Lib.document.createTextNode(String.fromCharCode(8214)));
		var fontContainer = js.Lib.document.createElement("span");
		fontContainer.style.position = "absolute";
		fontContainer.style.top = com.wiris.js.JsClientGraphicsContext.HIDDEN_TOP;
		fontContainer.className = "wrs_fontContainer";
		fontContainer.appendChild(aFont);
		fontContainer.appendChild(mathFont);
		fontContainer.appendChild(mathRTLFont);
		fontContainer.appendChild(horizontalFont);
		fontContainer.appendChild(specialFont);
		fontContainer.appendChild(specialSmallFont);
		this.container.parentNode.insertBefore(fontContainer,this.container);
	}
	,isFontLoaded: function(fontName) {
		return this.getMetrics(fontName,String.fromCharCode(61442))[0] > this.getMetrics("Arial","x")[0] * 2;
	}
	,getTextDimensions: function(fontName,text,drawing) {
		var cacheKey = text + ":" + this.style.getP() * this.style.getZoom() + ":" + this.style.getFontSize() + this.textDimensionsSuffix;
		if(fontName == "brackets") cacheKey += ":b";
		if(fontName == "brack_sm") cacheKey += ":s";
		if(drawing) cacheKey += ":d";
		var cachedDimensions = this.metricsCache.get(cacheKey);
		if(cachedDimensions != null) return cachedDimensions;
		if(fontName == "jsRootFont") {
			var charCode = HxOverrides.cca(text,0);
			var epsilon = Math.round(this.getMetrics("Arial","x")[1] * 0.1) | 0;
			var dimensions = [0,0,0];
			if(charCode >= com.wiris.editor.formula.WCharacter.ROOT && charCode <= com.wiris.editor.formula.WCharacter.ROOT_VERTICAL) {
				var height = 14 + (charCode - com.wiris.editor.formula.WCharacter.ROOT) * 2;
				dimensions = [13,height,height - epsilon];
			}
			if(charCode >= com.wiris.editor.formula.WCharacter.ROOT_NO_TAIL && charCode <= com.wiris.editor.formula.WCharacter.ROOT_NO_TAIL_VERTICAL) {
				var height = 14 + (charCode - com.wiris.editor.formula.WCharacter.ROOT_NO_TAIL) * 2;
				dimensions = [13,height,height - epsilon];
			}
			if(charCode == com.wiris.editor.formula.WCharacter.ROOT_LEFT_TAIL || charCode == com.wiris.editor.formula.WCharacter.ROOT_VERTICAL_LINE) dimensions = [1,10,10];
			return dimensions;
		}
		var insertInCache = true;
		var needsFont = false;
		var fontClassName = this.getFontClassName(fontName);
		if(fontClassName != null) needsFont = true;
		if(text.length == 1 && HxOverrides.cca(text,0) == 61442) insertInCache = false; else if(needsFont && !this.isFontLoaded(fontName)) {
			this.repaintNeeded = true;
			insertInCache = false;
		}
		this.metricsElement.className = this.styleClass;
		com.wiris.js.JsDOMUtils.addClass(this.metricsElement,fontClassName);
		this.metricsElement.style.fontSize = this.fontSize * (this.style.getP() * this.style.getZoom()) / 100 + "px";
		var textNode = js.Lib.document.createTextNode(text);
		this.metricsElement.replaceChild(textNode,this.metricsTextNode);
		this.metricsTextNode = textNode;
		var baseline = this.metricsImgNode.offsetTop;
		if(this.metricsImgNode.offsetHeight > 0) {
			insertInCache = false;
			this.repaintNeeded = true;
			baseline = this.metricsImgNode.offsetHeight;
		}
		var drawingCacheKey = drawing?cacheKey:cacheKey + ":d";
		var noDrawingCacheKey = !drawing?cacheKey:HxOverrides.substr(cacheKey,0,cacheKey.length - 2);
		var dimensions = [this.metricsElement.offsetWidth,this.metricsElement.offsetHeight,baseline];
		var standardDimensions;
		if(needsFont) {
			var fontSizePx = com.wiris.js.JsDOMUtils.getComputedStyleProperty(this.metricsElement,"font-size");
			var fontSize = Std.parseInt(HxOverrides.substr(fontSizePx,0,fontSizePx.length - 2));
			standardDimensions = [dimensions[0],dimensions[1],dimensions[2]];
			if(com.wiris.js.JsDOMUtils.hasClass(this.metricsElement,"wrs_specialSmallChar")) {
				standardDimensions[1] = Math.round(fontSize * 340.0 / 1024.0);
				standardDimensions[2] = standardDimensions[1];
			} else if(com.wiris.js.JsDOMUtils.hasClass(this.metricsElement,"wrs_specialChar")) {
				standardDimensions[1] = Math.round(fontSize * 896.0 / 1024.0);
				standardDimensions[2] = standardDimensions[1];
			}
		} else standardDimensions = this.standardHeightAndBaseline(fontName,text,dimensions);
		if(insertInCache) {
			this.metricsCache.set(drawingCacheKey,dimensions);
			this.metricsCache.set(noDrawingCacheKey,standardDimensions);
		}
		if(drawing) return dimensions;
		return standardDimensions;
	}
	,getStyle: function() {
		return this.style;
	}
	,getMetricsCache: function() {
		if(!this.areMetricsWellCalculated()) return null;
		return this.metricsCache;
	}
	,getFontFamilyClassName: function(fontFamily) {
		var i = HxOverrides.iter(fontFamily.toLowerCase().split(" "));
		fontFamily = i.next();
		while(i.hasNext()) {
			var part = i.next();
			if(part.length > 0) {
				fontFamily += part.toUpperCase().charAt(0);
				if(part.length > 1) fontFamily += HxOverrides.substr(part,1,part.length - 1);
			}
		}
		return "wrs_font_" + fontFamily;
	}
	,getColor: function() {
		return this.color;
	}
	,endTranslate: function(x,y,width,height) {
		this.x -= x;
		this.y -= y;
	}
	,drawVerticalLineWithType: function(id,x,y,height,type) {
		x += this.x;
		y += this.y;
		var lineWidth = this.getLineWidth();
		var halfLineWidth = lineWidth / 2 | 0;
		var line = js.Lib.document.createElement("span");
		if(type == "dotted") {
			line.style.borderLeftStyle = "dotted";
			line.style.borderLeftColor = this.rgbColor;
			line.style.borderLeftWidth = lineWidth + "px";
		} else if(type == "dashed") {
			line.style.borderLeftStyle = "dashed";
			line.style.borderLeftColor = this.rgbColor;
			line.style.borderLeftWidth = lineWidth + "px";
		} else {
			line.style.background = this.rgbColor;
			line.style.width = lineWidth + "px";
		}
		line.style.position = "absolute";
		line.style.zIndex = 2;
		line.style.top = y - halfLineWidth + "px";
		line.style.left = x - halfLineWidth + "px";
		line.style.height = com.wiris.js.JsDOMUtils.parseDimension(height + 2 * halfLineWidth) + "px";
		line.innerHTML = "&nbsp;";
		this.container.appendChild(line);
	}
	,drawVerticalLine: function(id,x,y,height) {
		x += this.x;
		y += this.y;
		var lineWidth = this.getLineWidth();
		var halfLineWidth = lineWidth / 2 | 0;
		var line = js.Lib.document.createElement("span");
		line.style.position = "absolute";
		line.style.zIndex = 2;
		line.style.background = this.rgbColor;
		line.style.top = y - halfLineWidth + "px";
		line.style.left = x - halfLineWidth + "px";
		line.style.width = lineWidth + "px";
		line.style.height = com.wiris.js.JsDOMUtils.parseDimension(height + 2 * halfLineWidth) + "px";
		line.innerHTML = "&nbsp;";
		this.container.appendChild(line);
	}
	,drawText: function(id,fontName,text,x,y,baseline) {
		x += this.x;
		y += this.y;
		if(fontName == "jsRootFont") {
			var charImage = js.Lib.document.createElement("img");
			var src = this.resourceLoader.getPath("charImages/" + StringTools.hex(HxOverrides.cca(text,0)).toLowerCase() + (this.style.isFlag(com.wiris.editor.BoxStyle.RTL_FLAG)?"_rtl.png":".png"));
			var dimensions = this.getTextDimensions(fontName,text,true);
			charImage.setAttribute("src",src);
			charImage.style.position = "absolute";
			charImage.style.zIndex = 2;
			charImage.style.top = y + baseline - dimensions[2] + "px";
			charImage.style.left = x + "px";
			charImage.style.width = dimensions[0] + "px";
			charImage.style.height = dimensions[1] + "px";
			this.container.appendChild(charImage);
		} else {
			var textContainer = js.Lib.document.createElement("span");
			this.setComponentColor(textContainer);
			var fontClassName = this.getFontClassName(fontName);
			if(fontClassName != null) com.wiris.js.JsDOMUtils.addClass(textContainer,fontClassName);
			com.wiris.js.JsDOMUtils.addClass(textContainer,this.styleClass);
			textContainer.style.fontSize = this.fontSize * (this.style.getP() * this.style.getZoom()) / 100 + "px";
			textContainer.style.position = "absolute";
			textContainer.style.zIndex = 2;
			textContainer.style.left = x + "px";
			textContainer.style.top = y + baseline - this.getTextDimensions(fontName,text,true)[2] + "px";
			var textNode = js.Lib.document.createTextNode(text);
			textContainer.appendChild(textNode);
			this.container.appendChild(textContainer);
		}
	}
	,drawLineVML: function(x1,y1,x2,y2) {
		var minX;
		var minY;
		var maxX;
		var maxY;
		if(x1 < x2) {
			minX = x1;
			maxX = x2;
		} else {
			minX = x2;
			maxX = x1;
		}
		if(y1 < y2) {
			minY = y1;
			maxY = y2;
		} else {
			minY = y2;
			maxY = y1;
		}
		x1 = x1 - minX;
		x2 = x2 - minX;
		y1 = y1 - minY;
		y2 = y2 - minY;
		var flooredHalfLineWidth = this.getLineWidth() / 2 | 0;
		this.drawVML(this.x + minX - flooredHalfLineWidth,this.y + minY - flooredHalfLineWidth,maxX - minX,maxY - minY,"<line xmlns=\"urn:schemas-microsoft-com:vml\" " + "style=\"behavior: url(#default#VML);display:inline-block;margin:0;padding:0;position:absolute;\" " + "strokecolor=\"" + this.rgbColor + "\" " + "from=\"" + x1 + "," + y1 + "\" to=\"" + x2 + "," + y2 + "\" strokeweight=\"" + this.getLineWidth() + "px\"></line>");
	}
	,drawLineSVG: function(x1,y1,x2,y2) {
		var minX;
		var minY;
		var maxX;
		var maxY;
		if(x1 < x2) {
			minX = x1;
			maxX = x2;
		} else {
			minX = x2;
			maxX = x1;
		}
		if(y1 < y2) {
			minY = y1;
			maxY = y2;
		} else {
			minY = y2;
			maxY = y1;
		}
		x1 = x1 - minX;
		x2 = x2 - minX;
		y1 = y1 - minY;
		y2 = y2 - minY;
		var flooredHalfLineWidth = this.getLineWidth() / 2 | 0;
		this.drawSVG(this.x + minX - flooredHalfLineWidth,this.y + minY - flooredHalfLineWidth,maxX - minX,maxY - minY,"<line x1=\"" + x1 + "\" y1=\"" + y1 + "\" x2=\"" + x2 + "\" y2=\"" + y2 + "\" style=\"stroke:" + this.rgbColor + ";stroke-width:" + this.getLineWidth() + ";\"/>");
	}
	,drawLine: function(x1,y1,x2,y2) {
		if(!this.browser.isIE() || Std.parseFloat(this.browser.getVersion()) >= 9) this.drawLineSVG(x1,y1,x2,y2); else this.drawLineVML(x1,y1,x2,y2);
	}
	,drawHorizontalLineWithType: function(id,x,y,width,type) {
		x += this.x;
		y += this.y;
		var lineWidth = this.getLineWidth();
		var halfLineWidth = lineWidth / 2 | 0;
		var line = js.Lib.document.createElement("span");
		if(type == "dotted") {
			line.style.borderTopStyle = "dotted";
			line.style.borderTopColor = this.rgbColor;
			line.style.borderTopWidth = lineWidth + "px";
		} else if(type == "dashed") {
			line.style.borderTopStyle = "dashed";
			line.style.borderTopColor = this.rgbColor;
			line.style.borderTopWidth = lineWidth + "px";
		} else {
			line.style.background = this.rgbColor;
			line.style.height = lineWidth + "px";
		}
		line.style.position = "absolute";
		line.style.zIndex = 2;
		line.style.top = y - halfLineWidth + "px";
		line.style.left = x - halfLineWidth + "px";
		line.style.width = com.wiris.js.JsDOMUtils.parseDimension(width + 2 * halfLineWidth) + "px";
		line.innerHTML = "&nbsp;";
		this.container.appendChild(line);
	}
	,drawHorizontalLine: function(id,x,y,width) {
		x += this.x;
		y += this.y;
		var lineWidth = this.getLineWidth();
		var halfLineWidth = lineWidth / 2 | 0;
		var line = js.Lib.document.createElement("span");
		line.style.position = "absolute";
		line.style.zIndex = 2;
		line.style.background = this.rgbColor;
		line.style.top = y - halfLineWidth + "px";
		line.style.left = x - halfLineWidth + "px";
		line.style.width = com.wiris.js.JsDOMUtils.parseDimension(width + 2 * halfLineWidth) + "px";
		line.style.height = lineWidth + "px";
		line.innerHTML = "&nbsp;";
		this.container.appendChild(line);
	}
	,beginTranslate: function(x,y,width,height) {
		if(this.firstTranslate) {
			this.rtl = this.style.isFlag(com.wiris.editor.BoxStyle.RTL_FLAG);
			this.firstTranslate = false;
		}
		this.x += x;
		this.y += y;
	}
	,areMetricsWellCalculated: function() {
		return this.isFontLoaded("brackets") && com.wiris.js.JsDOMUtils.isDescendant(js.Lib.document.body,this.container);
	}
	,rtl: null
	,firstTranslate: null
	,browser: null
	,y: null
	,x: null
	,textDimensionsSuffix: null
	,styleClass: null
	,style: null
	,smallBrackets: null
	,rgbColor: null
	,resourceLoader: null
	,repaintNeeded: null
	,originalStyle: null
	,metricsImgNode: null
	,metricsTextNode: null
	,metricsElement: null
	,metricsParent: null
	,metricsCache: null
	,fontSize: null
	,fontFamily: null
	,container: null
	,color: null
	,__class__: com.wiris.js.JsClientGraphicsContext
}
com.wiris.js.JsDOMUtils = $hxClasses["com.wiris.js.JsDOMUtils"] = function() { }
com.wiris.js.JsDOMUtils.__name__ = ["com","wiris","js","JsDOMUtils"];
com.wiris.js.JsDOMUtils.addEventListener = function(element,eventName,handler) {
	if(element.attachEvent) element.attachEvent("on" + eventName,handler); else element.addEventListener(eventName,handler,false);
}
com.wiris.js.JsDOMUtils.cancelEvent = function(e) {
	if(e.preventDefault) e.preventDefault(); else e.returnValue = false;
}
com.wiris.js.JsDOMUtils.getComputedStyle = function(element) {
	if(element.currentStyle) return element.currentStyle;
	return document.defaultView.getComputedStyle(element,null);
}
com.wiris.js.JsDOMUtils.getComputedStyleProperty = function(element,name) {
	var value;
	if(element.currentStyle) {
		var camelName = com.wiris.js.JsDOMUtils.camelize(name);
		value = element.currentStyle[camelName];
		if(value != null && value.length > 0) {
			var firstChar = HxOverrides.cca(value,0);
			if(firstChar >= 48 && firstChar <= 57 && !StringTools.endsWith(value,"px")) {
				left = element.style.left;
				rsLeft = element.runtimeStyle && element.runtimeStyle.left;
				if(rsLeft) element.runtimeStyle.left = element.currentStyle.left;
				element.style.left = camelName == "fontSize"?"1em":value;
				value = element.style.pixelLeft + "px";
				element.style.left = left;
				if(rsLeft) element.runtimeStyle.left = rsLeft;
			}
		}
	} else if(document.defaultView && document.defaultView.getComputedStyle) value = document.defaultView.getComputedStyle(element,null).getPropertyValue(name); else value = element.style[com.wiris.js.JsDOMUtils.camelize(name)];
	return value;
}
com.wiris.js.JsDOMUtils.camelize = function(str) {
	var start = 0;
	var pos;
	var sb = new StringBuf();
	while((pos = str.indexOf("-",start)) != -1) {
		sb.b += Std.string(HxOverrides.substr(str,start,pos - start));
		sb.b += Std.string(str.charAt(pos + 1).toUpperCase());
		start = pos + 2;
	}
	sb.b += Std.string(HxOverrides.substr(str,start,null));
	return sb.b;
}
com.wiris.js.JsDOMUtils.getElementsByClassName = function(parent,className,recursive) {
	var returnValue = new Array();
	var _g1 = 0, _g = parent.childNodes.length;
	while(_g1 < _g) {
		var i = _g1++;
		if(com.wiris.js.JsDOMUtils.hasClass(parent.childNodes[i],className)) returnValue.push(parent.childNodes[i]);
		if(recursive) returnValue.concat(com.wiris.js.JsDOMUtils.getElementsByClassName(parent.childNodes[i],className,true));
	}
	return returnValue;
}
com.wiris.js.JsDOMUtils.getEventTarget = function(event) {
	if(event.srcElement) return event.srcElement;
	return event.target;
}
com.wiris.js.JsDOMUtils.getLeft = function(element) {
	var left = 0;
	do {
		left += element.offsetLeft;
		if(com.wiris.js.JsDOMUtils.getComputedStyleProperty(element,"position") == "fixed") {
			left += com.wiris.js.JsDOMUtils.getWindowScroll()[0] | 0;
			element = null;
		} else {
			if(element != js.Lib.document.body) {
				var scrollElement = element.parentNode;
				while(scrollElement != null && scrollElement != element.offsetParent) {
					if(scrollElement.scrollLeft != null) left -= scrollElement.scrollLeft;
					scrollElement = scrollElement.parentNode;
				}
			}
			element = element.offsetParent;
		}
	} while(element != null);
	return left;
}
com.wiris.js.JsDOMUtils.getRelativeLeft = function(element,parent) {
	if(parent == null) return com.wiris.js.JsDOMUtils.getLeft(element);
	return com.wiris.js.JsDOMUtils.getLeft(element) - com.wiris.js.JsDOMUtils.getLeft(parent);
}
com.wiris.js.JsDOMUtils.getTop = function(element) {
	var top = 0;
	do {
		top += element.offsetTop;
		if(com.wiris.js.JsDOMUtils.getComputedStyleProperty(element,"position") == "fixed") {
			top += com.wiris.js.JsDOMUtils.getWindowScroll()[1] | 0;
			element = null;
		} else {
			if(element != js.Lib.document.body) {
				var scrollElement = element.parentNode;
				while(scrollElement != null && scrollElement != element.offsetParent) {
					if(scrollElement.scrollTop != null) top -= scrollElement.scrollTop;
					scrollElement = scrollElement.parentNode;
				}
			}
			element = element.offsetParent;
		}
	} while(element != null);
	return top;
}
com.wiris.js.JsDOMUtils.getRelativeTop = function(element,parent) {
	if(parent == null) return com.wiris.js.JsDOMUtils.getTop(element);
	return com.wiris.js.JsDOMUtils.getTop(element) - com.wiris.js.JsDOMUtils.getTop(parent);
}
com.wiris.js.JsDOMUtils.getWindowScroll = function() {
	var scroll = new Array();
	if(js.Lib.window.pageYOffset == undefined) {
		scroll[0] = js.Lib.document.documentElement.scrollLeft;
		scroll[1] = js.Lib.document.documentElement.scrollTop;
	} else {
		scroll[0] = js.Lib.window.pageXOffset;
		scroll[1] = js.Lib.window.pageYOffset;
	}
	return scroll;
}
com.wiris.js.JsDOMUtils.isDescendant = function(parent,possibleDescendant) {
	if(possibleDescendant.parentNode == null) return false;
	if(possibleDescendant.parentNode == parent) return true;
	return com.wiris.js.JsDOMUtils.isDescendant(parent,possibleDescendant.parentNode);
}
com.wiris.js.JsDOMUtils.parseDimension = function(x) {
	return x < 0 || x == null?0:x;
}
com.wiris.js.JsDOMUtils.removeChildren = function(element) {
	while(element.firstChild != null) element.removeChild(element.firstChild);
}
com.wiris.js.JsDOMUtils.hasClass = function(element,className) {
	if(element.className == null) return false;
	var classes = element.className.split(" ");
	var i = HxOverrides.iter(classes);
	while(i.hasNext()) if(i.next() == className) return true;
	return false;
}
com.wiris.js.JsDOMUtils.addClass = function(element,className) {
	if(element.className == "") element.className = className; else if(!com.wiris.js.JsDOMUtils.hasClass(element,className)) element.className += " " + className;
}
com.wiris.js.JsDOMUtils.removeClass = function(element,className) {
	var classes = element.className.split(" ");
	HxOverrides.remove(classes,className);
	element.className = classes.join(" ");
}
com.wiris.js.JsDOMUtils.activateClass = function(element,className) {
	if(!com.wiris.js.JsDOMUtils.hasClass(element,className)) com.wiris.js.JsDOMUtils.addClass(element,className);
}
com.wiris.js.JsDOMUtils.removeEventListener = function(element,eventName,handler) {
	if(js.Lib.isIE) element.detachEvent("on" + eventName,handler); else element.removeEventListener(eventName,handler,false);
}
com.wiris.js.JsDOMUtils.setCaretPosition = function(element,position,end) {
	if(element.setSelectionRange) element.setSelectionRange(position,end); else if(element.createTextRange) {
		var range = element.createTextRange();
		range.collapse(true);
		range.moveStart("character",position);
		range.moveEnd("character",end);
		range.select();
	}
}
com.wiris.js.JsDOMUtils.getSelectionBounds = function(element) {
	var bounds = new Array();
	if(element.selectionStart != null) {
		bounds[0] = element.selectionStart;
		bounds[1] = element.selectionEnd;
		return bounds;
	}
	var range = document.selection.createRange();
	if(range && range.parentElement() == element) {
		var length = element.value.length;
		var normalizedValue = element.value.split("\r\n").join("\n");
		var textInputRange = element.createTextRange();
		textInputRange.moveToBookmark(range.getBookmark());
		var endRange = element.createTextRange();
		endRange.collapse(false);
		if(textInputRange.compareEndPoints("StartToEnd",endRange) > -1) bounds[0] = bounds[1] = length; else {
			bounds[0] = -textInputRange.moveStart("character",-length);
			bounds[0] += normalizedValue.slice(0,bounds[0]).split("\n").length - 1;
			if(textInputRange.compareEndPoints("EndToEnd",endRange) > -1) bounds[1] = length; else {
				bounds[1] = -textInputRange.moveEnd("character",-length);
				bounds[1] += normalizedValue.slice(0,bounds[1]).split("\n").length - 1;
			}
		}
		return bounds;
	}
	return null;
}
com.wiris.js.JsDOMUtils.getMousePosition = function(target,e) {
	var elementScroll = new Array();
	elementScroll[0] = target.scrollLeft;
	elementScroll[1] = target.scrollTop;
	return com.wiris.js.JsDOMUtils.getMousePositionImpl(target,e,elementScroll,0);
}
com.wiris.js.JsDOMUtils.getMousePositionImpl = function(target,e,elementScroll,border) {
	var windowScroll = com.wiris.js.JsDOMUtils.getWindowScroll();
	var position = new Array();
	position[0] = windowScroll[0] + e.clientX - com.wiris.js.JsDOMUtils.getLeft(target) - border + elementScroll[0];
	position[1] = windowScroll[1] + e.clientY - com.wiris.js.JsDOMUtils.getTop(target) - border + elementScroll[1];
	return position;
}
com.wiris.js.JsDOMUtils.getTouchPosition = function(target,e) {
	var elementScroll = new Array();
	elementScroll[0] = target.scrollLeft;
	elementScroll[1] = target.scrollTop;
	return com.wiris.js.JsDOMUtils.getTouchPositionImpl(target,e,elementScroll,0);
}
com.wiris.js.JsDOMUtils.getTouchPositionImpl = function(target,e,elementScroll,border) {
	var position = new Array();
	position[0] = e.touches[0].clientX - com.wiris.js.JsDOMUtils.getLeft(target) - border + elementScroll[0];
	position[1] = e.touches[0].clientY - com.wiris.js.JsDOMUtils.getTop(target) - border + elementScroll[1];
	if(Std.parseFloat(com.wiris.js.JsDOMUtils.browser.getVersion()) >= 5.1) {
		var windowScroll = com.wiris.js.JsDOMUtils.getWindowScroll();
		position[0] += windowScroll[0];
		position[1] += windowScroll[1];
	}
	return position;
}
com.wiris.js.JsDOMUtils.getStandardButton = function(e) {
	var button = e.button;
	if(com.wiris.js.JsDOMUtils.browser.isIE()) {
		if(button == 1) button = 0; else if(button == 4) button = 1;
	}
	return button;
}
if(!com.wiris.settings) com.wiris.settings = {}
com.wiris.settings.PlatformSettings = $hxClasses["com.wiris.settings.PlatformSettings"] = function() { }
com.wiris.settings.PlatformSettings.__name__ = ["com","wiris","settings","PlatformSettings"];
if(!com.wiris.system) com.wiris.system = {}
com.wiris.system.ArrayEx = $hxClasses["com.wiris.system.ArrayEx"] = function() { }
com.wiris.system.ArrayEx.__name__ = ["com","wiris","system","ArrayEx"];
com.wiris.system.ArrayEx.contains = function(a,b) {
	var _g = 0;
	while(_g < a.length) {
		var x = a[_g];
		++_g;
		if(x == b) return true;
	}
	return false;
}
com.wiris.system.ResourceLoader = $hxClasses["com.wiris.system.ResourceLoader"] = function() {
	com.wiris.system.ResourceLoader.initialize();
	this.basePath = "";
};
com.wiris.system.ResourceLoader.__name__ = ["com","wiris","system","ResourceLoader"];
com.wiris.system.ResourceLoader.resourcesCache = null;
com.wiris.system.ResourceLoader.initialize = function() {
	if(com.wiris.system.ResourceLoader.resourcesCache == null) com.wiris.system.ResourceLoader.resourcesCache = new Hash();
}
com.wiris.system.ResourceLoader.newInstance = function(basePath) {
	var resourceLoader = new com.wiris.system.ResourceLoader();
	if(basePath.length > 0 && !StringTools.endsWith(basePath,"/")) basePath += "/";
	resourceLoader.basePath = basePath;
	return resourceLoader;
}
com.wiris.system.ResourceLoader.prototype = {
	getPath: function(path) {
		path += (path.indexOf("?") >= 0?"&":"?") + "v=" + this.loadResource("version.txt");
		if(StringTools.startsWith(path,"http://") || StringTools.startsWith(path,"https://")) return path;
		return this.basePath + path;
	}
	,loadStaticResource: function(path) {
		if(path == "editor_definition.xml") return com.wiris.system.ResourceLoader.editorDefinition;
		if(path == "characters.xml") return com.wiris.system.ResourceLoader.charactersDefinition;
		if(path == "version.txt") {
			if(com.wiris.system.ResourceLoader.version == null) {
			}
			return com.wiris.system.ResourceLoader.version;
		}
		if(path == "font_adjust.xml") return com.wiris.system.ResourceLoader.fontAdjust;
		if(StringTools.startsWith(path,"lang/")) {
			var lang = HxOverrides.substr(path,5,path.lastIndexOf(".") - 5);
			if(com.wiris.system.ResourceLoader.translations[lang]) return com.wiris.system.ResourceLoader.translations[lang];
			lang = lang.toLowerCase();
			lang = lang.split("-").join("_");
			if(com.wiris.system.ResourceLoader.translations[lang]) return com.wiris.system.ResourceLoader.translations[lang];
			lang = HxOverrides.substr(lang,0,2);
			if(com.wiris.system.ResourceLoader.translations[lang]) return com.wiris.system.ResourceLoader.translations[lang];
		}
		return null;
	}
	,loadResource: function(path) {
		var staticResource = this.loadStaticResource(path);
		if(staticResource != null) return staticResource;
		staticResource = haxe.Resource.getString(path);
		if(staticResource != null) return staticResource;
		return null;
	}
	,basePath: null
	,__class__: com.wiris.system.ResourceLoader
}
com.wiris.system.StringEx = $hxClasses["com.wiris.system.StringEx"] = function() { }
com.wiris.system.StringEx.__name__ = ["com","wiris","system","StringEx"];
com.wiris.system.StringEx.substring = function(s,start,end) {
	if(end == null) return HxOverrides.substr(s,start,null);
	return HxOverrides.substr(s,start,end - start);
}
com.wiris.system.StringEx.compareTo = function(s1,s2) {
	if(s1 > s2) return 1;
	if(s1 < s2) return -1;
	return 0;
}
com.wiris.system.System = $hxClasses["com.wiris.system.System"] = function() { }
com.wiris.system.System.__name__ = ["com","wiris","system","System"];
com.wiris.system.System.arraycopy = function(src,srcPos,dest,destPos,n) {
	var _g = 0;
	while(_g < n) {
		var i = _g++;
		dest[destPos + i] = src[srcPos + i];
	}
}
com.wiris.system.Utf8 = $hxClasses["com.wiris.system.Utf8"] = function() {
};
com.wiris.system.Utf8.__name__ = ["com","wiris","system","Utf8"];
com.wiris.system.Utf8.getLength = function(s) {
	return s.length;
}
com.wiris.system.Utf8.charCodeAt = function(s,i) {
	return HxOverrides.cca(s,i);
}
com.wiris.system.Utf8.charAt = function(s,i) {
	return com.wiris.system.Utf8.uchr(HxOverrides.cca(s,i));
}
com.wiris.system.Utf8.uchr = function(i) {
	var s = new haxe.Utf8();
	s.__b += String.fromCharCode(i);
	return s.__b;
}
com.wiris.system.Utf8.sub = function(s,pos,len) {
	return HxOverrides.substr(s,pos,len);
}
com.wiris.system.Utf8.toBytes = function(s) {
	return haxe.io.Bytes.ofString(s).b;
}
com.wiris.system.Utf8.fromBytes = function(s) {
	var bs = haxe.io.Bytes.ofData(s);
	return bs.toString();
}
com.wiris.system.Utf8.prototype = {
	__class__: com.wiris.system.Utf8
}
if(!com.wiris.test) com.wiris.test = {}
com.wiris.test.FontTest = $hxClasses["com.wiris.test.FontTest"] = function(basePath) {
	this.resourceLoader = com.wiris.system.ResourceLoader.newInstance(basePath);
};
com.wiris.test.FontTest.__name__ = ["com","wiris","test","FontTest"];
com.wiris.test.FontTest.prototype = {
	doTest: function(container,fontFamily,fontSize,fontStyle,text,smallBrackets) {
		this.container = container;
		this.fontFamily = fontFamily;
		this.fontSize = fontSize;
		this.fontStyle = fontStyle;
		this.text = text;
		this.smallBrackets = smallBrackets;
		this.doTestImpl();
	}
	,doTestImpl: function() {
		while(this.container.hasChildNodes()) this.container.removeChild(this.container.firstChild);
		var divMetrics = js.Lib.document.createElement("div");
		this.container.appendChild(divMetrics);
		var divText = js.Lib.document.createElement("div");
		this.container.appendChild(divText);
		com.wiris.js.JsDOMUtils.addClass(divText,"wrs_viewer");
		divText.style.height = "200px";
		divText.style.width = "600px";
		var gc = new com.wiris.js.JsClientGraphicsContext(divText,this.resourceLoader);
		var oldstyle = gc.getStyle();
		var newstyle = com.wiris.editor.BoxStyle.newBoxStyle(oldstyle);
		newstyle.setFontFamily(this.fontFamily);
		newstyle.setFontSize(this.fontSize);
		if(this.fontStyle == "normal") {
			newstyle.setFlag(com.wiris.editor.BoxStyle.ITALIC_FLAG,false);
			newstyle.setFlag(com.wiris.editor.BoxStyle.BOLD_FLAG,false);
		} else if(this.fontStyle == "italic") {
			newstyle.setFlag(com.wiris.editor.BoxStyle.ITALIC_FLAG,true);
			newstyle.setFlag(com.wiris.editor.BoxStyle.BOLD_FLAG,false);
		} else if(this.fontStyle == "bold") {
			newstyle.setFlag(com.wiris.editor.BoxStyle.ITALIC_FLAG,false);
			newstyle.setFlag(com.wiris.editor.BoxStyle.BOLD_FLAG,true);
		} else if(this.fontStyle == "bold-italic") {
			newstyle.setFlag(com.wiris.editor.BoxStyle.BOLD_FLAG,true);
			newstyle.setFlag(com.wiris.editor.BoxStyle.ITALIC_FLAG,true);
		}
		gc.setStyle(newstyle,null);
		gc.setBracketsSmaller(this.smallBrackets);
		var minwidth = 10000000;
		var maxwidth = -10000000;
		var minheight = 10000000;
		var maxheight = -10000000;
		var minbaseline = 10000000;
		var maxbaseline = -10000000;
		var i;
		var _g1 = 0, _g = this.text.length;
		while(_g1 < _g) {
			var i1 = _g1++;
			var c = HxOverrides.substr(this.text,i1,1);
			var width = 0;
			var height = 0;
			var baseline = 0;
			if(width < minwidth) minwidth = width;
			if(width > maxwidth) maxwidth = width;
			if(height < minheight) minheight = height;
			if(height > maxheight) maxheight = height;
			if(baseline < minbaseline) minbaseline = baseline;
			if(baseline > maxbaseline) maxbaseline = baseline;
		}
		var metricsText;
		metricsText = "Height: " + minheight;
		if(maxheight != minheight) metricsText += "-" + maxheight;
		metricsText += "px, Baseline: " + minbaseline;
		if(maxbaseline != minbaseline) metricsText += "-" + maxbaseline;
		metricsText += "px, Width: " + minwidth;
		if(maxwidth != minwidth) metricsText += "-" + maxwidth;
		metricsText += "px.";
		divMetrics.style.fontSize = "small";
		divMetrics.appendChild(js.Lib.document.createTextNode(metricsText));
		var x = 0;
		var _g1 = 0, _g = this.text.length;
		while(_g1 < _g) {
			var i1 = _g1++;
			var c = HxOverrides.substr(this.text,i1,1);
			var width = 0;
			var height = 0;
			var baseline = 0;
			var y = maxbaseline - baseline;
			gc.drawHorizontalLine(0,x,y + baseline,width);
			var span = divText.lastChild;
			var realWidth = span.offsetWidth;
			var realHeight = span.offsetHeight;
			var realTop = span.style.top;
			realTop = HxOverrides.substr(realTop,0,realTop.length - 2);
			var realBaseline = y + baseline - Std.parseInt(realTop);
			span.title = "calc(w:" + width + " h:" + height + " b:" + baseline + "); real(w:" + realWidth + " h:" + realHeight + " b:" + realBaseline + ")";
			x += width;
		}
		divText.style.height = maxheight + "px";
		divText.style.width = x + "px";
		if(gc.needsRepaint()) {
			if(this.repaintTimer == null) {
				this.repaintTimer = new haxe.Timer(100);
				this.repaintTimer.run = $bind(this,this.doTestImpl);
			}
		} else if(this.repaintTimer != null) {
			this.repaintTimer.stop();
			this.repaintTimer = null;
		}
	}
	,smallBrackets: null
	,text: null
	,fontStyle: null
	,fontSize: null
	,fontFamily: null
	,container: null
	,repaintTimer: null
	,resourceLoader: null
	,__class__: com.wiris.test.FontTest
}
if(!com.wiris.util.css) com.wiris.util.css = {}
com.wiris.util.css.CSSUtils = $hxClasses["com.wiris.util.css.CSSUtils"] = function() { }
com.wiris.util.css.CSSUtils.__name__ = ["com","wiris","util","css","CSSUtils"];
com.wiris.util.css.CSSUtils.colorToInt = function(color) {
	if(color == null) return 0;
	color = StringTools.trim(color);
	var colorLength = color.length;
	if(colorLength == 0) return 0;
	if(color.charAt(0) != "#") return 0;
	if(colorLength == 4) color = "" + color.charAt(1) + color.charAt(1) + color.charAt(2) + color.charAt(2) + color.charAt(3) + color.charAt(3); else if(colorLength == 7) color = HxOverrides.substr(color,1,6); else return 0;
	return com.wiris.common.WInteger.parseHex(color);
}
com.wiris.util.css.CSSUtils.intToColor = function(color) {
	return "#" + com.wiris.common.WInteger.toHex(color,6);
}
com.wiris.util.css.CSSUtils.pixelsToInt = function(pixels) {
	if(pixels == null) return 0;
	pixels = StringTools.trim(pixels);
	if(StringTools.endsWith(pixels,"px")) return Std.parseInt(HxOverrides.substr(pixels,0,pixels.length - 2));
	var parsedPixels = Std.parseInt(pixels);
	if(pixels == "" + parsedPixels) return parsedPixels;
	return 0;
}
com.wiris.util.css.CSSUtils.percentageToFloat = function(percentage) {
	if(percentage == null) return 0;
	percentage = StringTools.trim(percentage);
	if(StringTools.endsWith(percentage,"%")) return Std.parseFloat(HxOverrides.substr(percentage,0,percentage.length - 1));
	return 0;
}
com.wiris.util.css.CSSUtils.hashToCss = function(p0) {
	if(p0 == null) return "";
	var sb = new StringBuf();
	var keys = p0.keys();
	var skeys = new Array();
	while(keys.hasNext()) skeys.push(keys.next());
	com.wiris.util.css.CSSUtils.sort(skeys);
	var i;
	var _g1 = 0, _g = skeys.length;
	while(_g1 < _g) {
		var i1 = _g1++;
		var key = skeys[i1];
		if(i1 > 0) sb.b += Std.string(";");
		sb.b += Std.string(com.wiris.util.css.CSSUtils.camelCaseToHyphenDelimited(key));
		sb.b += Std.string(":");
		var value = p0.get(key);
		if(key == "fontFamily" && value.indexOf(" ") != -1) value = "'" + value + "'";
		sb.b += Std.string(value);
	}
	return sb.b;
}
com.wiris.util.css.CSSUtils.cssToHash = function(p0) {
	var ss = p0.split(";");
	var h = new Hash();
	var i;
	var _g1 = 0, _g = ss.length;
	while(_g1 < _g) {
		var i1 = _g1++;
		var kv = ss[i1].split(":");
		if(kv.length >= 2) {
			var input = kv[1];
			kv[0] = com.wiris.util.css.CSSUtils.hyphenDelimitedToCamelCase(StringTools.trim(kv[0]));
			kv[1] = StringTools.trim(kv[1]);
			if(kv[0] == "fontFamily" && com.wiris.util.css.CSSUtils.isMultipleWordValue(kv[1])) kv[1] = HxOverrides.substr(kv[1],1,kv[1].length - 2);
			h.set(kv[0],kv[1]);
		}
	}
	return h;
}
com.wiris.util.css.CSSUtils.isMultipleWordValue = function(value) {
	if(StringTools.startsWith(value,"\"") && StringTools.endsWith(value,"\"")) return true;
	return StringTools.startsWith(value,"'") && StringTools.endsWith(value,"'");
}
com.wiris.util.css.CSSUtils.camelCaseToHyphenDelimited = function(camel) {
	var upperACode = HxOverrides.cca("A",0);
	var upperZCode = HxOverrides.cca("Z",0);
	var i = 0;
	var hyphen = "";
	while(i < camel.length) {
		var code = HxOverrides.cca(camel,i);
		var character = HxOverrides.substr(camel,i,1);
		if(upperACode <= code && code <= upperZCode) hyphen += "-" + character.toLowerCase(); else hyphen += character;
		++i;
	}
	return hyphen;
}
com.wiris.util.css.CSSUtils.hyphenDelimitedToCamelCase = function(hyphen) {
	var i = HxOverrides.iter(hyphen.split("-"));
	if(!i.hasNext()) return "";
	var camel = i.next();
	while(i.hasNext()) {
		var word = i.next();
		if(word.length > 0) camel += HxOverrides.substr(word,0,1).toUpperCase() + HxOverrides.substr(word,1,null).toLowerCase();
	}
	return camel;
}
com.wiris.util.css.CSSUtils.sort = function(a) {
	var i;
	var j;
	var n = a.length;
	var _g = 0;
	while(_g < n) {
		var i1 = _g++;
		var _g1 = i1 + 1;
		while(_g1 < n) {
			var j1 = _g1++;
			var s1 = a[i1];
			var s2 = a[j1];
			if(com.wiris.system.StringEx.compareTo(s1,s2) > 0) {
				a[i1] = s2;
				a[j1] = s1;
			}
		}
	}
}
if(!com.wiris.util.xml) com.wiris.util.xml = {}
com.wiris.util.xml.WEntities = $hxClasses["com.wiris.util.xml.WEntities"] = function() { }
com.wiris.util.xml.WEntities.__name__ = ["com","wiris","util","xml","WEntities"];
com.wiris.util.xml.WXmlUtils = $hxClasses["com.wiris.util.xml.WXmlUtils"] = function() { }
com.wiris.util.xml.WXmlUtils.__name__ = ["com","wiris","util","xml","WXmlUtils"];
com.wiris.util.xml.WXmlUtils.getElementContent = function(element) {
	var sb = new StringBuf();
	if(element.nodeType == Xml.Document || element.nodeType == Xml.Element) {
		var i = element.iterator();
		while(i.hasNext()) sb.b += Std.string(i.next().toString());
	}
	return sb.b;
}
com.wiris.util.xml.WXmlUtils.getElementsByAttributeValue = function(nodeList,attributeName,attributeValue) {
	var nodes = new Array();
	while(nodeList.hasNext()) {
		var node = nodeList.next();
		if(node.nodeType == Xml.Element && attributeValue == com.wiris.util.xml.WXmlUtils.getAttribute(node,attributeName)) nodes.push(node);
	}
	return nodes;
}
com.wiris.util.xml.WXmlUtils.getElementsByTagName = function(nodeList,tagName) {
	var nodes = new Array();
	while(nodeList.hasNext()) {
		var node = nodeList.next();
		if(node.nodeType == Xml.Element && node.getNodeName() == tagName) nodes.push(node);
	}
	return nodes;
}
com.wiris.util.xml.WXmlUtils.getElements = function(node) {
	var nodes = new Array();
	var nodeList = node.iterator();
	while(nodeList.hasNext()) {
		var item = nodeList.next();
		if(item.nodeType == Xml.Element) nodes.push(item);
	}
	return nodes;
}
com.wiris.util.xml.WXmlUtils.getDocumentElement = function(doc) {
	var nodeList = doc.iterator();
	while(nodeList.hasNext()) {
		var node = nodeList.next();
		if(node.nodeType == Xml.Element) return node;
	}
	return null;
}
com.wiris.util.xml.WXmlUtils.getAttribute = function(node,attributeName) {
	var value = node.get(attributeName);
	if(value == null) return null;
	if(com.wiris.settings.PlatformSettings.PARSE_XML_ENTITIES) return com.wiris.util.xml.WXmlUtils.htmlUnescape(value);
	return value;
}
com.wiris.util.xml.WXmlUtils.setAttribute = function(node,name,value) {
	if(value != null && com.wiris.settings.PlatformSettings.PARSE_XML_ENTITIES) value = com.wiris.util.xml.WXmlUtils.htmlEscape(value);
	node.set(name,value);
}
com.wiris.util.xml.WXmlUtils.getNodeValue = function(node) {
	var value = node.getNodeValue();
	if(value == null) return null;
	if(com.wiris.settings.PlatformSettings.PARSE_XML_ENTITIES && node.nodeType == Xml.PCData) return com.wiris.util.xml.WXmlUtils.htmlUnescape(value);
	return value;
}
com.wiris.util.xml.WXmlUtils.createPCData = function(node,text) {
	if(com.wiris.settings.PlatformSettings.PARSE_XML_ENTITIES) text = com.wiris.util.xml.WXmlUtils.htmlEscape(text);
	return Xml.createPCData(text);
}
com.wiris.util.xml.WXmlUtils.htmlEscape = function(input) {
	var output = StringTools.replace(input,"&","&amp;");
	output = StringTools.replace(output,"<","&lt;");
	output = StringTools.replace(output,">","&gt;");
	output = StringTools.replace(output,"\"","&quot;");
	return output;
}
com.wiris.util.xml.WXmlUtils.htmlUnescape = function(input) {
	var output = "";
	var start = 0;
	var position = input.indexOf("&",start);
	while(position != -1) {
		output += HxOverrides.substr(input,start,position - start);
		if(input.charAt(position + 1) == "#") {
			var startPosition = position + 2;
			var endPosition = input.indexOf(";",startPosition);
			if(endPosition != -1) {
				var number = HxOverrides.substr(input,startPosition,endPosition - startPosition);
				if(StringTools.startsWith(number,"x")) number = "0" + number;
				var charCode = Std.parseInt(number);
				output += com.wiris.system.Utf8.uchr(charCode);
				start = endPosition + 1;
			} else {
				output += "&";
				start = position + 1;
			}
		} else {
			output += "&";
			start = position + 1;
		}
		position = input.indexOf("&",start);
	}
	output += HxOverrides.substr(input,start,input.length - start);
	output = StringTools.replace(output,"&lt;","<");
	output = StringTools.replace(output,"&gt;",">");
	output = StringTools.replace(output,"&quot;","\"");
	output = StringTools.replace(output,"&amp;","&");
	return output;
}
com.wiris.util.xml.WXmlUtils.entities = null;
com.wiris.util.xml.WXmlUtils.parseXML = function(xml) {
	xml = com.wiris.util.xml.WXmlUtils.filterMathMLEntities(xml);
	var x = Xml.parse(xml);
	return x;
}
com.wiris.util.xml.WXmlUtils.serializeXML = function(xml) {
	var s = xml.toString();
	s = com.wiris.util.xml.WXmlUtils.filterMathMLEntities(s);
	return s;
}
com.wiris.util.xml.WXmlUtils.filterMathMLEntities = function(text) {
	com.wiris.util.xml.WXmlUtils.initEntities();
	var sb = new StringBuf();
	var i = 0;
	var n = text.length;
	while(i < n) {
		var c = HxOverrides.cca(text,i);
		if(c == 60 && i + 12 < n && HxOverrides.cca(text,i + 1) == 33) {
			if(HxOverrides.substr(text,i,9) == "<![CDATA[") {
				var e = text.indexOf("]]>",i);
				if(e != -1) {
					sb.b += Std.string(HxOverrides.substr(text,i,e - i + 3));
					i = e + 3;
					continue;
				}
			}
		}
		if(c > 127) {
			var d = c;
			if(com.wiris.settings.PlatformSettings.UTF8_CONVERSION) {
				var j = 0;
				c = 128;
				do {
					c = c >> 1;
					j++;
				} while((d & c) != 0);
				d = c - 1 & d;
				while(--j > 0) {
					i++;
					c = HxOverrides.cca(text,i);
					d = (d << 6) + (c & 63);
				}
			}
			sb.b += Std.string("&#" + d + ";");
		} else {
			sb.b += String.fromCharCode(c);
			if(c == 38) {
				i++;
				c = HxOverrides.cca(text,i);
				if(com.wiris.util.xml.WXmlUtils.isNameStart(c)) {
					var name = new StringBuf();
					name.b += String.fromCharCode(c);
					i++;
					c = HxOverrides.cca(text,i);
					while(com.wiris.util.xml.WXmlUtils.isNameChar(c)) {
						name.b += String.fromCharCode(c);
						i++;
						c = HxOverrides.cca(text,i);
					}
					var ent = name.b;
					if(c == 59 && com.wiris.util.xml.WXmlUtils.entities.exists(ent)) {
						var val = com.wiris.util.xml.WXmlUtils.entities.get(ent);
						sb.b += Std.string("#");
						sb.b += Std.string(val);
					} else sb.b += Std.string(name);
				} else if(c == 35) {
					sb.b += String.fromCharCode(c);
					i++;
					c = HxOverrides.cca(text,i);
					if(c == 120) {
						var hex = new StringBuf();
						i++;
						c = HxOverrides.cca(text,i);
						while(com.wiris.util.xml.WXmlUtils.isHexDigit(c)) {
							hex.b += String.fromCharCode(c);
							i++;
							c = HxOverrides.cca(text,i);
						}
						var hent = hex.b;
						if(c == 59) {
							var dec = Std.parseInt("0x" + hent);
							sb.b += Std.string("" + dec);
						} else {
							sb.b += Std.string("x");
							sb.b += Std.string(hent);
						}
					}
				}
				sb.b += String.fromCharCode(c);
			}
		}
		i++;
	}
	return sb.b;
}
com.wiris.util.xml.WXmlUtils.isNameStart = function(c) {
	if(65 <= c && c <= 90) return true;
	if(97 <= c && c <= 122) return true;
	if(c == 95 || c == 58) return true;
	return false;
}
com.wiris.util.xml.WXmlUtils.isNameChar = function(c) {
	if(com.wiris.util.xml.WXmlUtils.isNameStart(c)) return true;
	if(48 <= c && c <= 57) return true;
	if(c == 46 || c == 45) return true;
	return false;
}
com.wiris.util.xml.WXmlUtils.isHexDigit = function(c) {
	if(c >= 48 && c <= 57) return true;
	if(c >= 65 && c <= 70) return true;
	if(c >= 97 && c <= 102) return true;
	return false;
}
com.wiris.util.xml.WXmlUtils.initEntities = function() {
	if(com.wiris.util.xml.WXmlUtils.entities == null) {
		var e = com.wiris.util.xml.WEntities.MATHML_ENTITIES;
		com.wiris.util.xml.WXmlUtils.entities = new Hash();
		var start = 0;
		var mid;
		while((mid = e.indexOf("@",start)) != -1) {
			var name = HxOverrides.substr(e,start,mid - start);
			mid++;
			start = e.indexOf("@",mid);
			if(start == -1) break;
			var value = HxOverrides.substr(e,mid,start - mid);
			var num = Std.parseInt("0x" + value);
			com.wiris.util.xml.WXmlUtils.entities.set(name,"" + num);
			start++;
		}
	}
}
com.wiris.util.xml.WXmlUtils.getText = function(xml) {
	if(xml.nodeType == Xml.PCData) return xml.getNodeValue();
	var r = "";
	var iter = xml.iterator();
	while(iter.hasNext()) r += com.wiris.util.xml.WXmlUtils.getText(iter.next());
	return r;
}
com.wiris.util.xml.WXmlUtils.copyXml = function(elem) {
	return com.wiris.util.xml.WXmlUtils.importXml(elem,elem);
}
com.wiris.util.xml.WXmlUtils.importXml = function(elem,model) {
	var n = null;
	if(elem.nodeType == Xml.Element) {
		n = Xml.createElement(elem.getNodeName());
		var keys = elem.attributes();
		while(keys.hasNext()) {
			var key = keys.next();
			n.set(key,elem.get(key));
		}
		var children = elem.iterator();
		while(children.hasNext()) n.addChild(com.wiris.util.xml.WXmlUtils.importXml(children.next(),model));
	} else if(elem.nodeType == Xml.Document) n = com.wiris.util.xml.WXmlUtils.importXml(elem.firstElement(),model); else if(elem.nodeType == Xml.CData) n = Xml.createCData(elem.getNodeValue()); else if(elem.nodeType == Xml.PCData) n = Xml.createPCData(elem.getNodeValue()); else throw "Unsupported node type: " + Std.string(elem.nodeType);
	return n;
}
com.wiris.util.xml.WXmlUtils.indentXml = function(xml,space) {
	var depth = 0;
	var opentag = new EReg("^<([\\w-_]+)[^>]*>$","");
	var autotag = new EReg("^<([\\w-_]+)[^>]*/>$","");
	var closetag = new EReg("^</([\\w-_]+)>$","");
	var res = new StringBuf();
	var end = 0;
	var start;
	var text;
	while(end < xml.length && (start = xml.indexOf("<",end)) != -1) {
		text = start > end;
		if(text) res.b += Std.string(HxOverrides.substr(xml,end,start - end));
		end = xml.indexOf(">",start) + 1;
		var aux = HxOverrides.substr(xml,start,end - start);
		if(autotag.match(aux)) {
			res.b += Std.string("\n");
			var i;
			var _g = 0;
			while(_g < depth) {
				var i1 = _g++;
				res.b += Std.string(space);
			}
			res.b += Std.string(aux);
		} else if(opentag.match(aux)) {
			res.b += Std.string("\n");
			var i;
			var _g = 0;
			while(_g < depth) {
				var i1 = _g++;
				res.b += Std.string(space);
			}
			res.b += Std.string(aux);
			depth++;
		} else if(closetag.match(aux)) {
			depth--;
			if(!text) {
				res.b += Std.string("\n");
				var i;
				var _g = 0;
				while(_g < depth) {
					var i1 = _g++;
					res.b += Std.string(space);
				}
			}
			res.b += Std.string(aux);
		} else {
			haxe.Log.trace("WARNING! malformed XML at character " + end + ":" + xml,{ fileName : "WXmlUtils.hx", lineNumber : 498, className : "com.wiris.util.xml.WXmlUtils", methodName : "indentXml"});
			res.b += Std.string(aux);
		}
	}
	return StringTools.trim(res.b);
}
var haxe = haxe || {}
haxe.Log = $hxClasses["haxe.Log"] = function() { }
haxe.Log.__name__ = ["haxe","Log"];
haxe.Log.trace = function(v,infos) {
	js.Boot.__trace(v,infos);
}
haxe.Log.clear = function() {
	js.Boot.__clear_trace();
}
haxe.Resource = $hxClasses["haxe.Resource"] = function() { }
haxe.Resource.__name__ = ["haxe","Resource"];
haxe.Resource.content = null;
haxe.Resource.listNames = function() {
	var names = new Array();
	var _g = 0, _g1 = haxe.Resource.content;
	while(_g < _g1.length) {
		var x = _g1[_g];
		++_g;
		names.push(x.name);
	}
	return names;
}
haxe.Resource.getString = function(name) {
	var _g = 0, _g1 = haxe.Resource.content;
	while(_g < _g1.length) {
		var x = _g1[_g];
		++_g;
		if(x.name == name) {
			if(x.str != null) return x.str;
			var b = haxe.Unserializer.run(x.data);
			return b.toString();
		}
	}
	return null;
}
haxe.Resource.getBytes = function(name) {
	var _g = 0, _g1 = haxe.Resource.content;
	while(_g < _g1.length) {
		var x = _g1[_g];
		++_g;
		if(x.name == name) {
			if(x.str != null) return haxe.io.Bytes.ofString(x.str);
			return haxe.Unserializer.run(x.data);
		}
	}
	return null;
}
haxe.Timer = $hxClasses["haxe.Timer"] = function(time_ms) {
	var me = this;
	this.id = window.setInterval(function() {
		me.run();
	},time_ms);
};
haxe.Timer.__name__ = ["haxe","Timer"];
haxe.Timer.delay = function(f,time_ms) {
	var t = new haxe.Timer(time_ms);
	t.run = function() {
		t.stop();
		f();
	};
	return t;
}
haxe.Timer.measure = function(f,pos) {
	var t0 = haxe.Timer.stamp();
	var r = f();
	haxe.Log.trace(haxe.Timer.stamp() - t0 + "s",pos);
	return r;
}
haxe.Timer.stamp = function() {
	return new Date().getTime() / 1000;
}
haxe.Timer.prototype = {
	run: function() {
	}
	,stop: function() {
		if(this.id == null) return;
		window.clearInterval(this.id);
		this.id = null;
	}
	,id: null
	,__class__: haxe.Timer
}
haxe.Unserializer = $hxClasses["haxe.Unserializer"] = function(buf) {
	this.buf = buf;
	this.length = buf.length;
	this.pos = 0;
	this.scache = new Array();
	this.cache = new Array();
	var r = haxe.Unserializer.DEFAULT_RESOLVER;
	if(r == null) {
		r = Type;
		haxe.Unserializer.DEFAULT_RESOLVER = r;
	}
	this.setResolver(r);
};
haxe.Unserializer.__name__ = ["haxe","Unserializer"];
haxe.Unserializer.initCodes = function() {
	var codes = new Array();
	var _g1 = 0, _g = haxe.Unserializer.BASE64.length;
	while(_g1 < _g) {
		var i = _g1++;
		codes[haxe.Unserializer.BASE64.charCodeAt(i)] = i;
	}
	return codes;
}
haxe.Unserializer.run = function(v) {
	return new haxe.Unserializer(v).unserialize();
}
haxe.Unserializer.prototype = {
	unserialize: function() {
		switch(this.buf.charCodeAt(this.pos++)) {
		case 110:
			return null;
		case 116:
			return true;
		case 102:
			return false;
		case 122:
			return 0;
		case 105:
			return this.readDigits();
		case 100:
			var p1 = this.pos;
			while(true) {
				var c = this.buf.charCodeAt(this.pos);
				if(c >= 43 && c < 58 || c == 101 || c == 69) this.pos++; else break;
			}
			return Std.parseFloat(HxOverrides.substr(this.buf,p1,this.pos - p1));
		case 121:
			var len = this.readDigits();
			if(this.buf.charCodeAt(this.pos++) != 58 || this.length - this.pos < len) throw "Invalid string length";
			var s = HxOverrides.substr(this.buf,this.pos,len);
			this.pos += len;
			s = StringTools.urlDecode(s);
			this.scache.push(s);
			return s;
		case 107:
			return Math.NaN;
		case 109:
			return Math.NEGATIVE_INFINITY;
		case 112:
			return Math.POSITIVE_INFINITY;
		case 97:
			var buf = this.buf;
			var a = new Array();
			this.cache.push(a);
			while(true) {
				var c = this.buf.charCodeAt(this.pos);
				if(c == 104) {
					this.pos++;
					break;
				}
				if(c == 117) {
					this.pos++;
					var n = this.readDigits();
					a[a.length + n - 1] = null;
				} else a.push(this.unserialize());
			}
			return a;
		case 111:
			var o = { };
			this.cache.push(o);
			this.unserializeObject(o);
			return o;
		case 114:
			var n = this.readDigits();
			if(n < 0 || n >= this.cache.length) throw "Invalid reference";
			return this.cache[n];
		case 82:
			var n = this.readDigits();
			if(n < 0 || n >= this.scache.length) throw "Invalid string reference";
			return this.scache[n];
		case 120:
			throw this.unserialize();
			break;
		case 99:
			var name = this.unserialize();
			var cl = this.resolver.resolveClass(name);
			if(cl == null) throw "Class not found " + name;
			var o = Type.createEmptyInstance(cl);
			this.cache.push(o);
			this.unserializeObject(o);
			return o;
		case 119:
			var name = this.unserialize();
			var edecl = this.resolver.resolveEnum(name);
			if(edecl == null) throw "Enum not found " + name;
			var e = this.unserializeEnum(edecl,this.unserialize());
			this.cache.push(e);
			return e;
		case 106:
			var name = this.unserialize();
			var edecl = this.resolver.resolveEnum(name);
			if(edecl == null) throw "Enum not found " + name;
			this.pos++;
			var index = this.readDigits();
			var tag = Type.getEnumConstructs(edecl)[index];
			if(tag == null) throw "Unknown enum index " + name + "@" + index;
			var e = this.unserializeEnum(edecl,tag);
			this.cache.push(e);
			return e;
		case 108:
			var l = new List();
			this.cache.push(l);
			var buf = this.buf;
			while(this.buf.charCodeAt(this.pos) != 104) l.add(this.unserialize());
			this.pos++;
			return l;
		case 98:
			var h = new Hash();
			this.cache.push(h);
			var buf = this.buf;
			while(this.buf.charCodeAt(this.pos) != 104) {
				var s = this.unserialize();
				h.set(s,this.unserialize());
			}
			this.pos++;
			return h;
		case 113:
			var h = new IntHash();
			this.cache.push(h);
			var buf = this.buf;
			var c = this.buf.charCodeAt(this.pos++);
			while(c == 58) {
				var i = this.readDigits();
				h.set(i,this.unserialize());
				c = this.buf.charCodeAt(this.pos++);
			}
			if(c != 104) throw "Invalid IntHash format";
			return h;
		case 118:
			var d = HxOverrides.strDate(HxOverrides.substr(this.buf,this.pos,19));
			this.cache.push(d);
			this.pos += 19;
			return d;
		case 115:
			var len = this.readDigits();
			var buf = this.buf;
			if(this.buf.charCodeAt(this.pos++) != 58 || this.length - this.pos < len) throw "Invalid bytes length";
			var codes = haxe.Unserializer.CODES;
			if(codes == null) {
				codes = haxe.Unserializer.initCodes();
				haxe.Unserializer.CODES = codes;
			}
			var i = this.pos;
			var rest = len & 3;
			var size = (len >> 2) * 3 + (rest >= 2?rest - 1:0);
			var max = i + (len - rest);
			var bytes = haxe.io.Bytes.alloc(size);
			var bpos = 0;
			while(i < max) {
				var c1 = codes[buf.charCodeAt(i++)];
				var c2 = codes[buf.charCodeAt(i++)];
				bytes.b[bpos++] = (c1 << 2 | c2 >> 4) & 255;
				var c3 = codes[buf.charCodeAt(i++)];
				bytes.b[bpos++] = (c2 << 4 | c3 >> 2) & 255;
				var c4 = codes[buf.charCodeAt(i++)];
				bytes.b[bpos++] = (c3 << 6 | c4) & 255;
			}
			if(rest >= 2) {
				var c1 = codes[buf.charCodeAt(i++)];
				var c2 = codes[buf.charCodeAt(i++)];
				bytes.b[bpos++] = (c1 << 2 | c2 >> 4) & 255;
				if(rest == 3) {
					var c3 = codes[buf.charCodeAt(i++)];
					bytes.b[bpos++] = (c2 << 4 | c3 >> 2) & 255;
				}
			}
			this.pos += len;
			this.cache.push(bytes);
			return bytes;
		case 67:
			var name = this.unserialize();
			var cl = this.resolver.resolveClass(name);
			if(cl == null) throw "Class not found " + name;
			var o = Type.createEmptyInstance(cl);
			this.cache.push(o);
			o.hxUnserialize(this);
			if(this.buf.charCodeAt(this.pos++) != 103) throw "Invalid custom data";
			return o;
		default:
		}
		this.pos--;
		throw "Invalid char " + this.buf.charAt(this.pos) + " at position " + this.pos;
	}
	,unserializeEnum: function(edecl,tag) {
		if(this.buf.charCodeAt(this.pos++) != 58) throw "Invalid enum format";
		var nargs = this.readDigits();
		if(nargs == 0) return Type.createEnum(edecl,tag);
		var args = new Array();
		while(nargs-- > 0) args.push(this.unserialize());
		return Type.createEnum(edecl,tag,args);
	}
	,unserializeObject: function(o) {
		while(true) {
			if(this.pos >= this.length) throw "Invalid object";
			if(this.buf.charCodeAt(this.pos) == 103) break;
			var k = this.unserialize();
			if(!js.Boot.__instanceof(k,String)) throw "Invalid object key";
			var v = this.unserialize();
			o[k] = v;
		}
		this.pos++;
	}
	,readDigits: function() {
		var k = 0;
		var s = false;
		var fpos = this.pos;
		while(true) {
			var c = this.buf.charCodeAt(this.pos);
			if(c != c) break;
			if(c == 45) {
				if(this.pos != fpos) break;
				s = true;
				this.pos++;
				continue;
			}
			if(c < 48 || c > 57) break;
			k = k * 10 + (c - 48);
			this.pos++;
		}
		if(s) k *= -1;
		return k;
	}
	,get: function(p) {
		return this.buf.charCodeAt(p);
	}
	,getResolver: function() {
		return this.resolver;
	}
	,setResolver: function(r) {
		if(r == null) this.resolver = { resolveClass : function(_) {
			return null;
		}, resolveEnum : function(_) {
			return null;
		}}; else this.resolver = r;
	}
	,resolver: null
	,scache: null
	,cache: null
	,length: null
	,pos: null
	,buf: null
	,__class__: haxe.Unserializer
}
haxe.Utf8 = $hxClasses["haxe.Utf8"] = function(size) {
	this.__b = "";
};
haxe.Utf8.__name__ = ["haxe","Utf8"];
haxe.Utf8.iter = function(s,chars) {
	var _g1 = 0, _g = s.length;
	while(_g1 < _g) {
		var i = _g1++;
		chars(HxOverrides.cca(s,i));
	}
}
haxe.Utf8.encode = function(s) {
	throw "Not implemented";
	return s;
}
haxe.Utf8.decode = function(s) {
	throw "Not implemented";
	return s;
}
haxe.Utf8.charCodeAt = function(s,index) {
	return HxOverrides.cca(s,index);
}
haxe.Utf8.validate = function(s) {
	return true;
}
haxe.Utf8.compare = function(a,b) {
	return a > b?1:a == b?0:-1;
}
haxe.Utf8.sub = function(s,pos,len) {
	return HxOverrides.substr(s,pos,len);
}
haxe.Utf8.prototype = {
	toString: function() {
		return this.__b;
	}
	,addChar: function(c) {
		this.__b += String.fromCharCode(c);
	}
	,__b: null
	,__class__: haxe.Utf8
}
if(!haxe.io) haxe.io = {}
haxe.io.Bytes = $hxClasses["haxe.io.Bytes"] = function(length,b) {
	this.length = length;
	this.b = b;
};
haxe.io.Bytes.__name__ = ["haxe","io","Bytes"];
haxe.io.Bytes.alloc = function(length) {
	var a = new Array();
	var _g = 0;
	while(_g < length) {
		var i = _g++;
		a.push(0);
	}
	return new haxe.io.Bytes(length,a);
}
haxe.io.Bytes.ofString = function(s) {
	var a = new Array();
	var _g1 = 0, _g = s.length;
	while(_g1 < _g) {
		var i = _g1++;
		var c = s.charCodeAt(i);
		if(c <= 127) a.push(c); else if(c <= 2047) {
			a.push(192 | c >> 6);
			a.push(128 | c & 63);
		} else if(c <= 65535) {
			a.push(224 | c >> 12);
			a.push(128 | c >> 6 & 63);
			a.push(128 | c & 63);
		} else {
			a.push(240 | c >> 18);
			a.push(128 | c >> 12 & 63);
			a.push(128 | c >> 6 & 63);
			a.push(128 | c & 63);
		}
	}
	return new haxe.io.Bytes(a.length,a);
}
haxe.io.Bytes.ofData = function(b) {
	return new haxe.io.Bytes(b.length,b);
}
haxe.io.Bytes.prototype = {
	getData: function() {
		return this.b;
	}
	,toHex: function() {
		var s = new StringBuf();
		var chars = [];
		var str = "0123456789abcdef";
		var _g1 = 0, _g = str.length;
		while(_g1 < _g) {
			var i = _g1++;
			chars.push(HxOverrides.cca(str,i));
		}
		var _g1 = 0, _g = this.length;
		while(_g1 < _g) {
			var i = _g1++;
			var c = this.b[i];
			s.b += String.fromCharCode(chars[c >> 4]);
			s.b += String.fromCharCode(chars[c & 15]);
		}
		return s.b;
	}
	,toString: function() {
		return this.readString(0,this.length);
	}
	,readString: function(pos,len) {
		if(pos < 0 || len < 0 || pos + len > this.length) throw haxe.io.Error.OutsideBounds;
		var s = "";
		var b = this.b;
		var fcc = String.fromCharCode;
		var i = pos;
		var max = pos + len;
		while(i < max) {
			var c = b[i++];
			if(c < 128) {
				if(c == 0) break;
				s += fcc(c);
			} else if(c < 224) s += fcc((c & 63) << 6 | b[i++] & 127); else if(c < 240) {
				var c2 = b[i++];
				s += fcc((c & 31) << 12 | (c2 & 127) << 6 | b[i++] & 127);
			} else {
				var c2 = b[i++];
				var c3 = b[i++];
				s += fcc((c & 15) << 18 | (c2 & 127) << 12 | c3 << 6 & 127 | b[i++] & 127);
			}
		}
		return s;
	}
	,compare: function(other) {
		var b1 = this.b;
		var b2 = other.b;
		var len = this.length < other.length?this.length:other.length;
		var _g = 0;
		while(_g < len) {
			var i = _g++;
			if(b1[i] != b2[i]) return b1[i] - b2[i];
		}
		return this.length - other.length;
	}
	,sub: function(pos,len) {
		if(pos < 0 || len < 0 || pos + len > this.length) throw haxe.io.Error.OutsideBounds;
		return new haxe.io.Bytes(len,this.b.slice(pos,pos + len));
	}
	,blit: function(pos,src,srcpos,len) {
		if(pos < 0 || srcpos < 0 || len < 0 || pos + len > this.length || srcpos + len > src.length) throw haxe.io.Error.OutsideBounds;
		var b1 = this.b;
		var b2 = src.b;
		if(b1 == b2 && pos > srcpos) {
			var i = len;
			while(i > 0) {
				i--;
				b1[i + pos] = b2[i + srcpos];
			}
			return;
		}
		var _g = 0;
		while(_g < len) {
			var i = _g++;
			b1[i + pos] = b2[i + srcpos];
		}
	}
	,set: function(pos,v) {
		this.b[pos] = v & 255;
	}
	,get: function(pos) {
		return this.b[pos];
	}
	,b: null
	,length: null
	,__class__: haxe.io.Bytes
}
haxe.io.Error = $hxClasses["haxe.io.Error"] = { __ename__ : ["haxe","io","Error"], __constructs__ : ["Blocked","Overflow","OutsideBounds","Custom"] }
haxe.io.Error.Blocked = ["Blocked",0];
haxe.io.Error.Blocked.toString = $estr;
haxe.io.Error.Blocked.__enum__ = haxe.io.Error;
haxe.io.Error.Overflow = ["Overflow",1];
haxe.io.Error.Overflow.toString = $estr;
haxe.io.Error.Overflow.__enum__ = haxe.io.Error;
haxe.io.Error.OutsideBounds = ["OutsideBounds",2];
haxe.io.Error.OutsideBounds.toString = $estr;
haxe.io.Error.OutsideBounds.__enum__ = haxe.io.Error;
haxe.io.Error.Custom = function(e) { var $x = ["Custom",3,e]; $x.__enum__ = haxe.io.Error; $x.toString = $estr; return $x; }
if(!haxe.xml) haxe.xml = {}
haxe.xml.Parser = $hxClasses["haxe.xml.Parser"] = function() { }
haxe.xml.Parser.__name__ = ["haxe","xml","Parser"];
haxe.xml.Parser.parse = function(str) {
	var doc = Xml.createDocument();
	haxe.xml.Parser.doParse(str,0,doc);
	return doc;
}
haxe.xml.Parser.doParse = function(str,p,parent) {
	if(p == null) p = 0;
	var xml = null;
	var state = 1;
	var next = 1;
	var aname = null;
	var start = 0;
	var nsubs = 0;
	var nbrackets = 0;
	var c = str.charCodeAt(p);
	while(!(c != c)) {
		switch(state) {
		case 0:
			switch(c) {
			case 10:case 13:case 9:case 32:
				break;
			default:
				state = next;
				continue;
			}
			break;
		case 1:
			switch(c) {
			case 60:
				state = 0;
				next = 2;
				break;
			default:
				start = p;
				state = 13;
				continue;
			}
			break;
		case 13:
			if(c == 60) {
				var child = Xml.createPCData(HxOverrides.substr(str,start,p - start));
				parent.addChild(child);
				nsubs++;
				state = 0;
				next = 2;
			}
			break;
		case 17:
			if(c == 93 && str.charCodeAt(p + 1) == 93 && str.charCodeAt(p + 2) == 62) {
				var child = Xml.createCData(HxOverrides.substr(str,start,p - start));
				parent.addChild(child);
				nsubs++;
				p += 2;
				state = 1;
			}
			break;
		case 2:
			switch(c) {
			case 33:
				if(str.charCodeAt(p + 1) == 91) {
					p += 2;
					if(HxOverrides.substr(str,p,6).toUpperCase() != "CDATA[") throw "Expected <![CDATA[";
					p += 5;
					state = 17;
					start = p + 1;
				} else if(str.charCodeAt(p + 1) == 68 || str.charCodeAt(p + 1) == 100) {
					if(HxOverrides.substr(str,p + 2,6).toUpperCase() != "OCTYPE") throw "Expected <!DOCTYPE";
					p += 8;
					state = 16;
					start = p + 1;
				} else if(str.charCodeAt(p + 1) != 45 || str.charCodeAt(p + 2) != 45) throw "Expected <!--"; else {
					p += 2;
					state = 15;
					start = p + 1;
				}
				break;
			case 63:
				state = 14;
				start = p;
				break;
			case 47:
				if(parent == null) throw "Expected node name";
				start = p + 1;
				state = 0;
				next = 10;
				break;
			default:
				state = 3;
				start = p;
				continue;
			}
			break;
		case 3:
			if(!(c >= 97 && c <= 122 || c >= 65 && c <= 90 || c >= 48 && c <= 57 || c == 58 || c == 46 || c == 95 || c == 45)) {
				if(p == start) throw "Expected node name";
				xml = Xml.createElement(HxOverrides.substr(str,start,p - start));
				parent.addChild(xml);
				state = 0;
				next = 4;
				continue;
			}
			break;
		case 4:
			switch(c) {
			case 47:
				state = 11;
				nsubs++;
				break;
			case 62:
				state = 9;
				nsubs++;
				break;
			default:
				state = 5;
				start = p;
				continue;
			}
			break;
		case 5:
			if(!(c >= 97 && c <= 122 || c >= 65 && c <= 90 || c >= 48 && c <= 57 || c == 58 || c == 46 || c == 95 || c == 45)) {
				var tmp;
				if(start == p) throw "Expected attribute name";
				tmp = HxOverrides.substr(str,start,p - start);
				aname = tmp;
				if(xml.exists(aname)) throw "Duplicate attribute";
				state = 0;
				next = 6;
				continue;
			}
			break;
		case 6:
			switch(c) {
			case 61:
				state = 0;
				next = 7;
				break;
			default:
				throw "Expected =";
			}
			break;
		case 7:
			switch(c) {
			case 34:case 39:
				state = 8;
				start = p;
				break;
			default:
				throw "Expected \"";
			}
			break;
		case 8:
			if(c == str.charCodeAt(start)) {
				var val = HxOverrides.substr(str,start + 1,p - start - 1);
				xml.set(aname,val);
				state = 0;
				next = 4;
			}
			break;
		case 9:
			p = haxe.xml.Parser.doParse(str,p,xml);
			start = p;
			state = 1;
			break;
		case 11:
			switch(c) {
			case 62:
				state = 1;
				break;
			default:
				throw "Expected >";
			}
			break;
		case 12:
			switch(c) {
			case 62:
				if(nsubs == 0) parent.addChild(Xml.createPCData(""));
				return p;
			default:
				throw "Expected >";
			}
			break;
		case 10:
			if(!(c >= 97 && c <= 122 || c >= 65 && c <= 90 || c >= 48 && c <= 57 || c == 58 || c == 46 || c == 95 || c == 45)) {
				if(start == p) throw "Expected node name";
				var v = HxOverrides.substr(str,start,p - start);
				if(v != parent.getNodeName()) throw "Expected </" + parent.getNodeName() + ">";
				state = 0;
				next = 12;
				continue;
			}
			break;
		case 15:
			if(c == 45 && str.charCodeAt(p + 1) == 45 && str.charCodeAt(p + 2) == 62) {
				parent.addChild(Xml.createComment(HxOverrides.substr(str,start,p - start)));
				p += 2;
				state = 1;
			}
			break;
		case 16:
			if(c == 91) nbrackets++; else if(c == 93) nbrackets--; else if(c == 62 && nbrackets == 0) {
				parent.addChild(Xml.createDocType(HxOverrides.substr(str,start,p - start)));
				state = 1;
			}
			break;
		case 14:
			if(c == 63 && str.charCodeAt(p + 1) == 62) {
				p++;
				var str1 = HxOverrides.substr(str,start + 1,p - start - 2);
				parent.addChild(Xml.createProlog(str1));
				state = 1;
			}
			break;
		}
		c = str.charCodeAt(++p);
	}
	if(state == 1) {
		start = p;
		state = 13;
	}
	if(state == 13) {
		if(p != start || nsubs == 0) parent.addChild(Xml.createPCData(HxOverrides.substr(str,start,p - start)));
		return p;
	}
	throw "Unexpected end";
}
haxe.xml.Parser.isValidChar = function(c) {
	return c >= 97 && c <= 122 || c >= 65 && c <= 90 || c >= 48 && c <= 57 || c == 58 || c == 46 || c == 95 || c == 45;
}
var js = js || {}
js.Boot = $hxClasses["js.Boot"] = function() { }
js.Boot.__name__ = ["js","Boot"];
js.Boot.__unhtml = function(s) {
	return s.split("&").join("&amp;").split("<").join("&lt;").split(">").join("&gt;");
}
js.Boot.__trace = function(v,i) {
	var msg = i != null?i.fileName + ":" + i.lineNumber + ": ":"";
	msg += js.Boot.__string_rec(v,"");
	var d;
	if(typeof(document) != "undefined" && (d = document.getElementById("haxe:trace")) != null) d.innerHTML += js.Boot.__unhtml(msg) + "<br/>"; else if(typeof(console) != "undefined" && console.log != null) console.log(msg);
}
js.Boot.__clear_trace = function() {
	var d = document.getElementById("haxe:trace");
	if(d != null) d.innerHTML = "";
}
js.Boot.isClass = function(o) {
	return o.__name__;
}
js.Boot.isEnum = function(e) {
	return e.__ename__;
}
js.Boot.getClass = function(o) {
	return o.__class__;
}
js.Boot.__string_rec = function(o,s) {
	if(o == null) return "null";
	if(s.length >= 5) return "<...>";
	var t = typeof(o);
	if(t == "function" && (o.__name__ || o.__ename__)) t = "object";
	switch(t) {
	case "object":
		if(o instanceof Array) {
			if(o.__enum__) {
				if(o.length == 2) return o[0];
				var str = o[0] + "(";
				s += "\t";
				var _g1 = 2, _g = o.length;
				while(_g1 < _g) {
					var i = _g1++;
					if(i != 2) str += "," + js.Boot.__string_rec(o[i],s); else str += js.Boot.__string_rec(o[i],s);
				}
				return str + ")";
			}
			var l = o.length;
			var i;
			var str = "[";
			s += "\t";
			var _g = 0;
			while(_g < l) {
				var i1 = _g++;
				str += (i1 > 0?",":"") + js.Boot.__string_rec(o[i1],s);
			}
			str += "]";
			return str;
		}
		var tostr;
		try {
			tostr = o.toString;
		} catch( e ) {
			return "???";
		}
		if(tostr != null && tostr != Object.toString) {
			var s2 = o.toString();
			if(s2 != "[object Object]") return s2;
		}
		var k = null;
		var str = "{\n";
		s += "\t";
		var hasp = o.hasOwnProperty != null;
		for( var k in o ) { ;
		if(hasp && !o.hasOwnProperty(k)) {
			continue;
		}
		if(k == "prototype" || k == "__class__" || k == "__super__" || k == "__interfaces__" || k == "__properties__") {
			continue;
		}
		if(str.length != 2) str += ", \n";
		str += s + k + " : " + js.Boot.__string_rec(o[k],s);
		}
		s = s.substring(1);
		str += "\n" + s + "}";
		return str;
	case "function":
		return "<function>";
	case "string":
		return o;
	default:
		return String(o);
	}
}
js.Boot.__interfLoop = function(cc,cl) {
	if(cc == null) return false;
	if(cc == cl) return true;
	var intf = cc.__interfaces__;
	if(intf != null) {
		var _g1 = 0, _g = intf.length;
		while(_g1 < _g) {
			var i = _g1++;
			var i1 = intf[i];
			if(i1 == cl || js.Boot.__interfLoop(i1,cl)) return true;
		}
	}
	return js.Boot.__interfLoop(cc.__super__,cl);
}
js.Boot.__instanceof = function(o,cl) {
	try {
		if(o instanceof cl) {
			if(cl == Array) return o.__enum__ == null;
			return true;
		}
		if(js.Boot.__interfLoop(o.__class__,cl)) return true;
	} catch( e ) {
		if(cl == null) return false;
	}
	switch(cl) {
	case Int:
		return Math.ceil(o%2147483648.0) === o;
	case Float:
		return typeof(o) == "number";
	case Bool:
		return o === true || o === false;
	case String:
		return typeof(o) == "string";
	case Dynamic:
		return true;
	default:
		if(o == null) return false;
		if(cl == Class && o.__name__ != null) return true; else null;
		if(cl == Enum && o.__ename__ != null) return true; else null;
		return o.__enum__ == cl;
	}
}
js.Boot.__cast = function(o,t) {
	if(js.Boot.__instanceof(o,t)) return o; else throw "Cannot cast " + Std.string(o) + " to " + Std.string(t);
}
js.Lib = $hxClasses["js.Lib"] = function() { }
js.Lib.__name__ = ["js","Lib"];
js.Lib.document = null;
js.Lib.window = null;
js.Lib.debug = function() {
	debugger;
}
js.Lib.alert = function(v) {
	alert(js.Boot.__string_rec(v,""));
}
js.Lib.eval = function(code) {
	return eval(code);
}
js.Lib.setErrorHandler = function(f) {
	js.Lib.onerror = f;
}
var $_;
function $bind(o,m) { var f = function(){ return f.method.apply(f.scope, arguments); }; f.scope = o; f.method = m; return f; };
if(Array.prototype.indexOf) HxOverrides.remove = function(a,o) {
	var i = a.indexOf(o);
	if(i == -1) return false;
	a.splice(i,1);
	return true;
}; else null;
Math.__name__ = ["Math"];
Math.NaN = Number.NaN;
Math.NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY;
Math.POSITIVE_INFINITY = Number.POSITIVE_INFINITY;
$hxClasses.Math = Math;
Math.isFinite = function(i) {
	return isFinite(i);
};
Math.isNaN = function(i) {
	return isNaN(i);
};
String.prototype.__class__ = $hxClasses.String = String;
String.__name__ = ["String"];
Array.prototype.__class__ = $hxClasses.Array = Array;
Array.__name__ = ["Array"];
Date.prototype.__class__ = $hxClasses.Date = Date;
Date.__name__ = ["Date"];
var Int = $hxClasses.Int = { __name__ : ["Int"]};
var Dynamic = $hxClasses.Dynamic = { __name__ : ["Dynamic"]};
var Float = $hxClasses.Float = Number;
Float.__name__ = ["Float"];
var Bool = $hxClasses.Bool = Boolean;
Bool.__ename__ = ["Bool"];
var Class = $hxClasses.Class = { __name__ : ["Class"]};
var Enum = { };
var Void = $hxClasses.Void = { __ename__ : ["Void"]};
Xml.Element = "element";
Xml.PCData = "pcdata";
Xml.CData = "cdata";
Xml.Comment = "comment";
Xml.DocType = "doctype";
Xml.Prolog = "prolog";
Xml.Document = "document";
haxe.Resource.content = [];
if(typeof document != "undefined") js.Lib.document = document;
if(typeof window != "undefined") {
	js.Lib.window = window;
	js.Lib.window.onerror = function(msg,url,line) {
		var f = js.Lib.onerror;
		if(f == null) return false;
		return f(msg,[url + ":" + line]);
	};
}
com.wiris.editor.BoxStyle.COLOR_FLAG = 1;
com.wiris.editor.BoxStyle.SCRIPT_LEVEL_FLAG = 2;
com.wiris.editor.BoxStyle.PROPORTIONAL_SIZE_FLAG = 4;
com.wiris.editor.BoxStyle.ITALIC_FLAG = 8;
com.wiris.editor.BoxStyle.BOLD_FLAG = 16;
com.wiris.editor.BoxStyle.PIXELS_SIZE_FLAG = 32;
com.wiris.editor.BoxStyle.DISPLAY_STYLE_FLAG = 64;
com.wiris.editor.BoxStyle.FONT_FAMILY_FLAG = 128;
com.wiris.editor.BoxStyle.MTEXT_FLAG = 256;
com.wiris.editor.BoxStyle.LINE_WIDTH_FLAG = 512;
com.wiris.editor.BoxStyle.ZOOM_FLAG = 1024;
com.wiris.editor.BoxStyle.WIDTH_FLAG = 2048;
com.wiris.editor.BoxStyle.INVISIBLE_FLAG = 4096;
com.wiris.editor.BoxStyle.RTL_FLAG = 8192;
com.wiris.editor.BoxStyle.MAX_WIDTH_FLAG = 16384;
com.wiris.editor.BoxStyle.ALIGN_FLAG = 32768;
com.wiris.editor.BoxStyle.CLASSTYPE_FLAG = 65536;
com.wiris.editor.BoxStyle.FORCED_LIGATURE_FLAG = 131072;
com.wiris.editor.BoxStyle.IGNORE_PROPORTIONAL_SIZE_FLAG = 262144;
com.wiris.editor.BoxStyle.UNUSEDC_FLAG = 524288;
com.wiris.editor.BoxStyle.FONT_MASK = com.wiris.editor.BoxStyle.ITALIC_FLAG | com.wiris.editor.BoxStyle.BOLD_FLAG | com.wiris.editor.BoxStyle.FONT_FAMILY_FLAG;
com.wiris.editor.BoxStyle.BIT_REMOVE_FLAG = 20;
com.wiris.editor.BoxStyle.FIRST_REMOVE_FLAG = 1048576;
com.wiris.editor.BoxStyle.REMOVE_ITALIC_FLAG = 8388608;
com.wiris.editor.BoxStyle.REMOVE_BOLD_FLAG = 16777216;
com.wiris.editor.BoxStyle.REMOVE_PIXELS_SIZE_FLAG = 33554432;
com.wiris.editor.BoxStyle.REMOVE_FONT_FAMILY_FLAG = 134217728;
com.wiris.editor.BoxStyle.REMOVE_MTEXT_FLAG = 268435456;
com.wiris.editor.BoxStyle.LEFT_ALIGN = 1;
com.wiris.editor.BoxStyle.RIGHT_ALIGN = 2;
com.wiris.editor.BoxStyle.CENTER_ALIGN = 3;
com.wiris.editor.BoxStyle.DECIMAL_ALIGN = 4;
com.wiris.editor.BoxStyle.RELATION_ALIGN = 5;
com.wiris.editor.BoxStyle.AUTO_ALIGN = 6;
com.wiris.editor.formula.WCharacter.NEGATIVE_THIN_SPACE = 57344;
com.wiris.editor.formula.WCharacter.ROOT = 61696;
com.wiris.editor.formula.WCharacter.ROOT_VERTICAL = 61727;
com.wiris.editor.formula.WCharacter.ROOT_NO_TAIL = 61728;
com.wiris.editor.formula.WCharacter.ROOT_NO_TAIL_VERTICAL = 61759;
com.wiris.editor.formula.WCharacter.ROOT_LEFT_TAIL = 61760;
com.wiris.editor.formula.WCharacter.ROOT_VERTICAL_LINE = 61761;
com.wiris.editor.formula.WCharacter.ROUND_BRACKET_LEFT = 40;
com.wiris.editor.formula.WCharacter.ROUND_BRACKET_RIGHT = 41;
com.wiris.editor.formula.WCharacter.SQUARE_BRACKET_LEFT = 91;
com.wiris.editor.formula.WCharacter.SQUARE_BRACKET_RIGHT = 93;
com.wiris.editor.formula.WCharacter.CIRCUMFLEX_ACCENT = 94;
com.wiris.editor.formula.WCharacter.CURLY_BRACKET_LEFT = 123;
com.wiris.editor.formula.WCharacter.VERTICAL_BAR = 124;
com.wiris.editor.formula.WCharacter.CURLY_BRACKET_RIGHT = 125;
com.wiris.editor.formula.WCharacter.TILDE = 126;
com.wiris.editor.formula.WCharacter.MACRON = 175;
com.wiris.editor.formula.WCharacter.COMBINING_LOW_LINE = 818;
com.wiris.editor.formula.WCharacter.CARON = 711;
com.wiris.editor.formula.WCharacter.EN_QUAD = 8192;
com.wiris.editor.formula.WCharacter.EM_QUAD = 8193;
com.wiris.editor.formula.WCharacter.EN_SPACE = 8194;
com.wiris.editor.formula.WCharacter.EM_SPACE = 8195;
com.wiris.editor.formula.WCharacter.THICK_SPACE = 8196;
com.wiris.editor.formula.WCharacter.MID_SPACE = 8197;
com.wiris.editor.formula.WCharacter.SIX_PER_EM_SPACE = 8198;
com.wiris.editor.formula.WCharacter.FIGIRE_SPACE = 8199;
com.wiris.editor.formula.WCharacter.PUNCTUATION_SPACE = 8200;
com.wiris.editor.formula.WCharacter.THIN_SPACE = 8201;
com.wiris.editor.formula.WCharacter.HAIR_SPACE = 8202;
com.wiris.editor.formula.WCharacter.ZERO_WIDTH_SPACE = 8203;
com.wiris.editor.formula.WCharacter.ZERO_WIDTH_NON_JOINER = 8204;
com.wiris.editor.formula.WCharacter.ZERO_WIDTH_JOINER = 8205;
com.wiris.editor.formula.WCharacter.DOUBLE_VERTICAL_BAR = 8214;
com.wiris.editor.formula.WCharacter.DOUBLE_HORIZONTAL_BAR = 9552;
com.wiris.editor.formula.WCharacter.NARROW_NO_BREAK_SPACE = 8239;
com.wiris.editor.formula.WCharacter.MEDIUM_MATHEMATICAL_SPACE = 8287;
com.wiris.editor.formula.WCharacter.WORD_JOINER = 8288;
com.wiris.editor.formula.WCharacter.PLANCKOVER2PI = 8463;
com.wiris.editor.formula.WCharacter.LEFTWARDS_ARROW = 8592;
com.wiris.editor.formula.WCharacter.UPWARDS_ARROW = 8593;
com.wiris.editor.formula.WCharacter.RIGHTWARDS_ARROW = 8594;
com.wiris.editor.formula.WCharacter.DOWNWARDS_ARROW = 8595;
com.wiris.editor.formula.WCharacter.LEFTRIGHT_ARROW = 8596;
com.wiris.editor.formula.WCharacter.UP_DOWN_ARROW = 8597;
com.wiris.editor.formula.WCharacter.LEFTWARDS_ARROW_FROM_BAR = 8612;
com.wiris.editor.formula.WCharacter.RIGHTWARDS_ARROW_FROM_BAR = 8614;
com.wiris.editor.formula.WCharacter.LEFTWARDS_ARROW_WITH_HOOK = 8617;
com.wiris.editor.formula.WCharacter.RIGHTWARDS_ARROW_WITH_HOOK = 8618;
com.wiris.editor.formula.WCharacter.LEFTWARDS_HARPOON_WITH_BARB_UPWARDS = 8636;
com.wiris.editor.formula.WCharacter.RIGHTWARDS_HARPOON_WITH_BARB_UPWARDS = 8640;
com.wiris.editor.formula.WCharacter.LEFTWARDS_DOUBLE_ARROW = 8656;
com.wiris.editor.formula.WCharacter.RIGHTWARDS_DOUBLE_ARROW = 8658;
com.wiris.editor.formula.WCharacter.LEFT_RIGHT_DOUBLE_ARROW = 8660;
com.wiris.editor.formula.WCharacter.TILDE_OPERATOR = 8764;
com.wiris.editor.formula.WCharacter.LEFT_CEILING = 8968;
com.wiris.editor.formula.WCharacter.RIGHT_CEILING = 8969;
com.wiris.editor.formula.WCharacter.LEFT_FLOOR = 8970;
com.wiris.editor.formula.WCharacter.RIGHT_FLOOR = 8971;
com.wiris.editor.formula.WCharacter.TOP_PARENTHESIS = 9180;
com.wiris.editor.formula.WCharacter.BOTTOM_PARENTHESIS = 9181;
com.wiris.editor.formula.WCharacter.TOP_SQUARE_BRACKET = 9140;
com.wiris.editor.formula.WCharacter.BOTTOM_SQUARE_BRACKET = 9141;
com.wiris.editor.formula.WCharacter.TOP_CURLY_BRACKET = 9182;
com.wiris.editor.formula.WCharacter.BOTTOM_CURLY_BRACKET = 9183;
com.wiris.editor.formula.WCharacter.MATHEMATICAL_LEFT_ANGLE_BRACKET = 10216;
com.wiris.editor.formula.WCharacter.MATHEMATICAL_RIGHT_ANGLE_BRACKET = 10217;
com.wiris.editor.formula.WCharacter.DOUBLE_STRUCK_ITALIC_CAPITAL_D = 8517;
com.wiris.editor.formula.WCharacter.DOUBLE_STRUCK_ITALIC_SMALL_D = 8518;
com.wiris.editor.formula.WCharacter.DOUBLE_STRUCK_ITALIC_SMALL_E = 8519;
com.wiris.editor.formula.WCharacter.DOUBLE_STRUCK_ITALIC_SMALL_I = 8520;
com.wiris.editor.formula.WCharacter.EPSILON = 949;
com.wiris.editor.formula.WCharacter.VAREPSILON = 1013;
com.wiris.editor.formula.WCharacter.binaryOps = [43,45,47,177,183,215,247,8226,8722,8723,8724,8726,8727,8728,8743,8744,8745,8746,8760,8768,8846,8851,8852,8853,8854,8855,8856,8857,8858,8859,8861,8862,8863,8864,8865,8890,8891,8900,8901,8902,8903,8905,8906,8907,8908,8910,8911,8914,8915,8966,9021,9675,10678,10789,10794,10797,10798,10799,10804,10805,10812,10815,10835,10836,10837,10838,10846,10847,10851];
com.wiris.editor.formula.WCharacter.relations = [60,61,62,8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8608,8610,8611,8614,8617,8618,8619,8620,8621,8622,8624,8625,8627,8630,8631,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661,8666,8667,8669,8693,8712,8713,8715,8716,8733,8739,8740,8741,8742,8764,8765,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8781,8782,8783,8784,8785,8786,8787,8788,8789,8790,8791,8793,8794,8795,8796,8799,8800,8801,8802,8804,8805,8806,8807,8808,8809,8810,8811,8812,8814,8815,8816,8817,8818,8819,8820,8821,8822,8823,8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839,8840,8841,8842,8843,8847,8848,8849,8850,8866,8867,8869,8871,8872,8873,8874,8875,8876,8877,8878,8879,8882,8883,8884,8885,8886,8887,8888,8904,8909,8912,8913,8918,8919,8920,8921,8922,8923,8926,8927,8930,8931,8934,8935,8936,8937,8938,8939,8940,8941,8994,8995,9123,10229,10230,10231,10232,10233,10234,10236,10239,10501,10514,10515,10531,10532,10533,10534,10535,10536,10537,10538,10547,10550,10551,10560,10561,10562,10564,10567,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586,10587,10588,10589,10590,10591,10592,10593,10606,10607,10608,10620,10621,10869,10877,10878,10885,10886,10887,10888,10889,10890,10891,10892,10901,10902,10909,10910,10913,10914,10927,10928,10933,10934,10935,10936,10937,10938,10949,10950,10955,10956,10987,11005];
com.wiris.editor.formula.WCharacter.largeOps = [8719,8720,8721,8896,8897,8898,8899,10756,10757,10758,10759,10760];
com.wiris.editor.formula.WCharacter.veryLargeOps = [8747,8748,8749,8750,8751,8752,8753,8754,8755,10763,10764,10765,10766,10767,10768,10774,10775,10776,10777,10778,10779,10780];
com.wiris.editor.formula.WCharacter.tallLetters = [98,100,102,104,105,106,107,108,116,946,948,950,952,955,958];
com.wiris.editor.formula.WCharacter.longLetters = [103,106,112,113,121,946,947,950,951,956,958,961,962,966,967,968];
com.wiris.editor.formula.WCharacter.negations = [61,8800,8801,8802,8764,8769,8712,8713,8715,8716,8834,8836,8835,8837,8838,8840,8839,8841,62,8815,60,8814,8805,8817,8804,8816,10878,8817,10877,8816,8776,8777,8771,8772,8773,8775,8849,8930,8850,8931,8707,8708,8741,8742];
com.wiris.editor.formula.WCharacter.mirrorDictionary = [40,41,41,40,60,62,62,60,91,93,93,91,123,125,125,123,171,187,187,171,3898,3899,3899,3898,3900,3901,3901,3900,5787,5788,5788,5787,8249,8250,8250,8249,8261,8262,8262,8261,8317,8318,8318,8317,8333,8334,8334,8333,8712,8715,8713,8716,8714,8717,8715,8712,8716,8713,8717,8714,8725,10741,8764,8765,8765,8764,8771,8909,8786,8787,8787,8786,8788,8789,8789,8788,8804,8805,8805,8804,8806,8807,8807,8806,8808,8809,8809,8808,8810,8811,8811,8810,8814,8815,8815,8814,8816,8817,8817,8816,8818,8819,8819,8818,8820,8821,8821,8820,8822,8823,8823,8822,8824,8825,8825,8824,8826,8827,8827,8826,8828,8829,8829,8828,8830,8831,8831,8830,8832,8833,8833,8832,8834,8835,8835,8834,8836,8837,8837,8836,8838,8839,8839,8838,8840,8841,8841,8840,8842,8843,8843,8842,8847,8848,8848,8847,8849,8850,8850,8849,8856,10680,8866,8867,8867,8866,8870,10974,8872,10980,8873,10979,8875,10981,8880,8881,8881,8880,8882,8883,8883,8882,8884,8885,8885,8884,8886,8887,8887,8886,8905,8906,8906,8905,8907,8908,8908,8907,8909,8771,8912,8913,8913,8912,8918,8919,8919,8918,8920,8921,8921,8920,8922,8923,8923,8922,8924,8925,8925,8924,8926,8927,8927,8926,8928,8929,8929,8928,8930,8931,8931,8930,8932,8933,8933,8932,8934,8935,8935,8934,8936,8937,8937,8936,8938,8939,8939,8938,8940,8941,8941,8940,8944,8945,8945,8944,8946,8954,8947,8955,8948,8956,8950,8957,8951,8958,8954,8946,8955,8947,8956,8948,8957,8950,8958,8951,8968,8969,8969,8968,8970,8971,8971,8970,9001,9002,9002,9001,10088,10089,10089,10088,10090,10091,10091,10090,10092,10093,10093,10092,10094,10095,10095,10094,10096,10097,10097,10096,10098,10099,10099,10098,10100,10101,10101,10100,10179,10180,10180,10179,10181,10182,10182,10181,10184,10185,10185,10184,10187,10189,10189,10187,10197,10198,10198,10197,10205,10206,10206,10205,10210,10211,10211,10210,10212,10213,10213,10212,10214,10215,10215,10214,10216,10217,10217,10216,10218,10219,10219,10218,10220,10221,10221,10220,10222,10223,10223,10222,10627,10628,10628,10627,10629,10630,10630,10629,10631,10632,10632,10631,10633,10634,10634,10633,10635,10636,10636,10635,10637,10640,10638,10639,10639,10638,10640,10637,10641,10642,10642,10641,10643,10644,10644,10643,10645,10646,10646,10645,10647,10648,10648,10647,10680,8856,10688,10689,10689,10688,10692,10693,10693,10692,10703,10704,10704,10703,10705,10706,10706,10705,10708,10709,10709,10708,10712,10713,10713,10712,10714,10715,10715,10714,10741,8725,10744,10745,10745,10744,10748,10749,10749,10748,10795,10796,10796,10795,10797,10798,10798,10797,10804,10805,10805,10804,10812,10813,10813,10812,10852,10853,10853,10852,10873,10874,10874,10873,10877,10878,10878,10877,10879,10880,10880,10879,10881,10882,10882,10881,10883,10884,10884,10883,10891,10892,10892,10891,10897,10898,10898,10897,10899,10900,10900,10899,10901,10902,10902,10901,10903,10904,10904,10903,10905,10906,10906,10905,10907,10908,10908,10907,10913,10914,10914,10913,10918,10919,10919,10918,10920,10921,10921,10920,10922,10923,10923,10922,10924,10925,10925,10924,10927,10928,10928,10927,10931,10932,10932,10931,10939,10940,10940,10939,10941,10942,10942,10941,10943,10944,10944,10943,10945,10946,10946,10945,10947,10948,10948,10947,10949,10950,10950,10949,10957,10958,10958,10957,10959,10960,10960,10959,10961,10962,10962,10961,10963,10964,10964,10963,10965,10966,10966,10965,10974,8870,10979,8873,10980,8872,10981,8875,10988,10989,10989,10988,10999,11000,11000,10999,11001,11002,11002,11001,11778,11779,11779,11778,11780,11781,11781,11780,11785,11786,11786,11785,11788,11789,11789,11788,11804,11805,11805,11804,11808,11809,11809,11808,11810,11811,11811,11810,11812,11813,11813,11812,11814,11815,11815,11814,11816,11817,11817,11816,12296,12297,12297,12296,12298,12299,12299,12298,12300,12301,12301,12300,12302,12303,12303,12302,12304,12305,12305,12304,12308,12309,12309,12308,12310,12311,12311,12310,12312,12313,12313,12312,12314,12315,12315,12314,65113,65114,65114,65113,65115,65116,65116,65115,65117,65118,65118,65117,65124,65125,65125,65124,65288,65289,65289,65288,65308,65310,65310,65308,65339,65341,65341,65339,65371,65373,65373,65371,65375,65376,65376,65375,65378,65379,65379,65378,9115,9118,9116,9119,9117,9120,9118,9115,9119,9116,9120,9117,9121,9124,9122,9125,9123,9126,9124,9121,9125,9122,9126,9123,9127,9131,9130,9134,9129,9133,9131,9127,9134,9130,9133,9129,9128,9132,9132,9128];
com.wiris.editor.formula.WCharacter.horizontalLTRStretchyChars = [com.wiris.editor.formula.WCharacter.LEFTWARDS_ARROW,com.wiris.editor.formula.WCharacter.RIGHTWARDS_ARROW,com.wiris.editor.formula.WCharacter.LEFTRIGHT_ARROW,com.wiris.editor.formula.WCharacter.LEFTWARDS_ARROW_FROM_BAR,com.wiris.editor.formula.WCharacter.RIGHTWARDS_ARROW_FROM_BAR,com.wiris.editor.formula.WCharacter.LEFTWARDS_ARROW_WITH_HOOK,com.wiris.editor.formula.WCharacter.RIGHTWARDS_ARROW_WITH_HOOK,com.wiris.editor.formula.WCharacter.LEFTWARDS_HARPOON_WITH_BARB_UPWARDS,com.wiris.editor.formula.WCharacter.RIGHTWARDS_HARPOON_WITH_BARB_UPWARDS,com.wiris.editor.formula.WCharacter.LEFTWARDS_DOUBLE_ARROW,com.wiris.editor.formula.WCharacter.RIGHTWARDS_DOUBLE_ARROW,com.wiris.editor.formula.WCharacter.TOP_CURLY_BRACKET,com.wiris.editor.formula.WCharacter.BOTTOM_CURLY_BRACKET,com.wiris.editor.formula.WCharacter.TOP_PARENTHESIS,com.wiris.editor.formula.WCharacter.BOTTOM_PARENTHESIS,com.wiris.editor.formula.WCharacter.TOP_SQUARE_BRACKET,com.wiris.editor.formula.WCharacter.BOTTOM_SQUARE_BRACKET];
com.wiris.editor.formula.WCharacter.invisible = [8289,8290,8291];
com.wiris.editor.formula.WCharacter.horizontalOperators = [175,818,8592,8594,8596,8612,8614,8617,8618,8636,8640,8656,8658,8660,8764,9140,9141,9180,9181,9182,9183,9552];
com.wiris.editor.formula.WCharacter.latinLetters = "@0065@0066@0067@0068@0069@0070@0071@0072@0073@0074@0075@0076@0077@0078@0079@0080@0081@0082@0083@0084@0085@0086@0087@0088@0089@0090" + "@0097@0098@0099@0100@0101@0102@0103@0104@0105@0106@0107@0108@0109@0110@0111@0112@0113@0114@0115@0116@0117@0118@0119@0120@0121@0122@";
com.wiris.editor.formula.WCharacter.greekLetters = "@0913@0914@0935@0916@0917@0934@0915@0919@0921@0977@0922@0923@0924@0925@0927@0928@0920@0929@0931@0932@0933@0962@0937@0926@0936@0918" + "@0945@0946@0967@0948@0949@0966@0947@0951@0953@0966@0954@0955@0956@0957@0959@0960@0952@0961@0963@0964@0965@0982@0969@0958@0968@0950@";
com.wiris.js.JsClientGraphicsContext.HIDDEN_TOP = "-9999px";
com.wiris.js.JsClientGraphicsContext.DEFAULT_COLOR = 0;
com.wiris.js.JsClientGraphicsContext.DEFAULT_FONT_FAMILY = "Arial";
com.wiris.js.JsClientGraphicsContext.DEFAULT_FONT_SIZE = 16;
com.wiris.js.JsDOMUtils.browser = new com.wiris.js.JsBrowser();
com.wiris.settings.PlatformSettings.PARSE_XML_ENTITIES = true;
com.wiris.settings.PlatformSettings.UTF8_CONVERSION = false;
com.wiris.settings.PlatformSettings.IS_FLASH = false;
com.wiris.system.ResourceLoader.editorDefinition = null;
com.wiris.system.ResourceLoader.charactersDefinition = null;
com.wiris.system.ResourceLoader.translations = { };
com.wiris.system.ResourceLoader.version = null;
com.wiris.system.ResourceLoader.fontAdjust = null;
com.wiris.util.xml.WEntities.s1 = "boxDL@02557@boxDl@02556@boxdL@02555@boxdl@02510@boxDR@02554@boxDr@02553@boxdR@02552@boxdr@0250C@boxH@02550@boxh@02500@boxHD@02566@boxHd@02564@boxhD@02565@boxhd@0252C@boxHU@02569@boxHu@02567@boxhU@02568@boxhu@02534@boxUL@0255D@boxUl@0255C@boxuL@0255B@boxul@02518@boxUR@0255A@boxUr@02559@boxuR@02558@boxur@02514@boxV@02551@boxv@02502@boxVH@0256C@boxVh@0256B@boxvH@0256A@boxvh@0253C@boxVL@02563@boxVl@02562@boxvL@02561@boxvl@02524@boxVR@02560@boxVr@0255F@boxvR@0255E@boxvr@0251C@Acy@00410@acy@00430@Bcy@00411@bcy@00431@CHcy@00427@chcy@00447@Dcy@00414@dcy@00434@Ecy@0042D@ecy@0044D@Fcy@00424@fcy@00444@Gcy@00413@gcy@00433@HARDcy@0042A@hardcy@0044A@Icy@00418@icy@00438@IEcy@00415@iecy@00435@IOcy@00401@iocy@00451@Jcy@00419@jcy@00439@Kcy@0041A@kcy@0043A@KHcy@00425@khcy@00445@Lcy@0041B@lcy@0043B@Mcy@0041C@mcy@0043C@Ncy@0041D@ncy@0043D@numero@02116@Ocy@0041E@ocy@0043E@Pcy@0041F@pcy@0043F@Rcy@00420@rcy@00440@Scy@00421@scy@00441@SHCHcy@00429@shchcy@00449@SHcy@00428@shcy@00448@SOFTcy@0042C@softcy@0044C@Tcy@00422@tcy@00442@TScy@00426@tscy@00446@Ucy@00423@ucy@00443@Vcy@00412@vcy@00432@YAcy@0042F@yacy@0044F@Ycy@0042B@ycy@0044B@YUcy@0042E@yucy@0044E@Zcy@00417@zcy@00437@ZHcy@00416@zhcy@00436@DJcy@00402@djcy@00452@DScy@00405@dscy@00455@DZcy@0040F@dzcy@0045F@GJcy@00403@gjcy@00453@Iukcy@00406@iukcy@00456@Jsercy@00408@jsercy@00458@Jukcy@00404@jukcy@00454@KJcy@0040C@kjcy@0045C@LJcy@00409@ljcy@00459@NJcy@0040A@njcy@0045A@TSHcy@0040B@tshcy@0045B@Ubrcy@0040E@ubrcy@0045E@YIcy@00407@yicy@00457@acute@000B4@breve@002D8@caron@002C7@cedil@000B8@circ@002C6@dblac@002DD@die@000A8@dot@002D9@grave@00060@macr@000AF@ogon@002DB@ring@002DA@tilde@002DC@uml@000A8@Aacute@000C1@aacute@000E1@Acirc@000C2@acirc@000E2@AElig@000C6@aelig@000E6@Agrave@000C0@agrave@000E0@Aring@000C5@aring@000E5@Atilde@000C3@atilde@000E3@Auml@000C4@auml@000E4@Ccedil@000C7@ccedil@000E7@Eacute@000C9@eacute@000E9@Ecirc@000CA@ecirc@000EA@Egrave@000C8@egrave@000E8@ETH@000D0@eth@000F0@Euml@000CB@euml@000EB@Iacute@000CD@iacute@000ED@Icirc@000CE@icirc@000EE@Igrave@000CC@igrave@000EC@Iuml@000CF@iuml@000EF@Ntilde@000D1@ntilde@000F1@Oacute@000D3@oacute@000F3@Ocirc@000D4@ocirc@000F4@Ograve@000D2@ograve@000F2@Oslash@000D8@oslash@000F8@Otilde@000D5@otilde@000F5@Ouml@000D6@ouml@000F6@szlig@000DF@THORN@000DE@thorn@000FE@Uacute@000DA@uacute@000FA@Ucirc@000DB@ucirc@000FB@Ugrave@000D9@ugrave@000F9@Uuml@000DC@uuml@000FC@Yacute@000DD@yacute@000FD@yuml@000FF@Abreve@00102@abreve@00103@Amacr@00100@amacr@00101@Aogon@00104@aogon@00105@Cacute@00106@cacute@00107@Ccaron@0010C@ccaron@0010D@Ccirc@00108@ccirc@00109@Cdot@0010A@cdot@0010B@Dcaron@0010E@dcaron@0010F@Dstrok@00110@dstrok@00111@Ecaron@0011A@ecaron@0011B@Edot@00116@edot@00117@Emacr@00112@emacr@00113@ENG@0014A@eng@0014B@Eogon@00118@eogon@00119@gacute@001F5@Gbreve@0011E@gbreve@0011F@Gcedil@00122@Gcirc@0011C@gcirc@0011D@Gdot@00120@gdot@00121@Hcirc@00124@hcirc@00125@Hstrok@00126@hstrok@00127@Idot@00130@IJlig@00132@ijlig@00133@Imacr@0012A@imacr@0012B@inodot@00131@Iogon@0012E@iogon@0012F@Itilde@00128@itilde@00129@Jcirc@00134@jcirc@00135@Kcedil@00136@kcedil@00137@kgreen@00138@Lacute@00139@lacute@0013A@Lcaron@0013D@lcaron@0013E@Lcedil@0013B@lcedil@0013C@Lmidot@0013F@lmidot@00140@Lstrok@00141@lstrok@00142@Nacute@00143@nacute@00144@napos@00149@Ncaron@00147@ncaron@00148@Ncedil@00145@ncedil@00146@Odblac@00150@odblac@00151@OElig@00152@oelig@00153@Omacr@0014C@omacr@0014D@Racute@00154@racute@00155@Rcaron@00158@rcaron@00159@Rcedil@00156@rcedil@00157@Sacute@0015A@sacute@0015B@Scaron@00160@scaron@00161@Scedil@0015E@scedil@0015F@Scirc@0015C@scirc@0015D@Tcaron@00164@tcaron@00165@Tcedil@00162@tcedil@00163@Tstrok@00166@tstrok@00167@Ubreve@0016C@ubreve@0016D@Udblac@00170@udblac@00171@Umacr@0016A@umacr@0016B@Uogon@00172@uogon@00173@Uring@0016E@uring@0016F@Utilde@00168@utilde@00169@Wcirc@00174@wcirc@00175@Ycirc@00176@ycirc@00177@Yuml@00178@Zacute@00179@zacute@0017A@Zcaron@0017D@zcaron@0017E@Zdot@0017B@zdot@0017C@apos@00027@ast@0002A@brvbar@000A6@bsol@0005C@cent@000A2@colon@0003A@comma@0002C@commat@00040@copy@000A9@curren@000A4@darr@02193@deg@000B0@divide@000F7@dollar@00024@equals@0003D@excl@00021@frac12@000BD@frac14@000BC@frac18@0215B@frac34@000BE@frac38@0215C@frac58@0215D@frac78@0215E@gt@0003E@half@000BD@horbar@02015@hyphen@02010@iexcl@000A1@iquest@000BF@laquo@000AB@larr@02190@lcub@0007B@ldquo@0201C@lowbar@0005F@lpar@00028@lsqb@0005B@lsquo@02018@micro@000B5@middot@000B7@nbsp@000A0@not@000AC@num@00023@ohm@02126@ordf@000AA@ordm@000BA@para@000B6@percnt@00025@period@0002E@plus@0002B@plusmn@000B1@pound@000A3@quest@0003F@quot@00022@raquo@000BB@rarr@02192@rcub@0007D@rdquo@0201D@reg@000AE@rpar@00029@rsqb@0005D@rsquo@02019@sect@000A7@semi@0003B@shy@000AD@sol@0002F@sung@0266A@sup1@000B9@sup2@000B2@sup3@000B3@times@000D7@trade@02122@uarr@02191@verbar@0007C@yen@000A5@blank@02423@blk12@02592@blk14@02591@blk34@02593@block@02588@bull@02022@caret@02041@check@02713@cir@025CB@clubs@02663@copysr@02117@cross@02717@Dagger@02021@dagger@02020@dash@02010@diams@02666@dlcrop@0230D@drcrop@0230C@dtri@025BF@dtrif@025BE@emsp@02003@emsp13@02004@emsp14@02005@ensp@02002@female@02640@ffilig@0FB03@fflig@0FB00@ffllig@0FB04@filig@0FB01@flat@0266D@fllig@0FB02@frac13@02153@frac15@02155@frac16@02159@frac23@02154@frac25@02156@frac35@02157@frac45@02158@frac56@0215A@hairsp@0200A@hearts@02665@hellip@02026@hybull@02043@incare@02105@ldquor@0201E@lhblk@02584@loz@025CA@lozf@029EB@lsquor@0201A@ltri@025C3@ltrif@025C2@male@02642@malt@02720@marker@025AE@mdash@02014@mldr@02026@natur@0266E@ndash@02013@nldr@02025@numsp@02007@phone@0260E@puncsp@02008@rdquor@0201D@rect@025AD@rsquor@02019@rtri@025B9@rtrif@025B8@rx@0211E@sext@02736@sharp@0266F@spades@02660@squ@025A1@squf@025AA@star@02606@starf@02605@target@02316@telrec@02315@thinsp@02009@uhblk@02580@ulcrop@0230F@urcrop@0230E@utri@025B5@utrif@025B4@vellip@022EE@angzarr@0237C@cirmid@02AEF@cudarrl@02938@cudarrr@02935@cularr@021B6@cularrp@0293D@curarr@021B7@curarrm@0293C@Darr@021A1@dArr@021D3@ddarr@021CA@DDotrahd@02911@dfisht@0297F@dHar@02965@dharl@021C3@dharr@021C2@duarr@021F5@duhar@0296F@dzigrarr@027FF@erarr@02971@hArr@021D4@harr@02194@harrcir@02948@harrw@021AD@hoarr@021FF@imof@022B7@lAarr@021DA@Larr@0219E@larrbfs@0291F@larrfs@0291D@larrhk@021A9@larrlp@021AB@larrpl@02939@larrsim@02973@larrtl@021A2@lAtail@0291B@latail@02919@lBarr@0290E@lbarr@0290C@ldca@02936@ldrdhar@02967@ldrushar@0294B@ldsh@021B2@lfisht@0297C@lHar@02962@lhard@021BD@lharu@021BC@lharul@0296A@llarr@021C7@llhard@0296B@loarr@021FD@lrarr@021C6@lrhar@021CB@lrhard@0296D@lsh@021B0@lurdshar@0294A@luruhar@02966@Map@02905@map@021A6@midcir@02AF0@mumap@022B8@nearhk@02924@neArr@021D7@nearr@02197@nesear@02928@nhArr@021CE@nharr@021AE@nlArr@021CD@nlarr@0219A@nrArr@021CF@nrarr@0219B@nvHarr@02904@nvlArr@02902@nvrArr@02903@nwarhk@02923@nwArr@021D6@nwarr@02196@nwnear@02927@olarr@021BA@orarr@021BB@origof@022B6@rAarr@021DB@Rarr@021A0@rarrap@02975@rarrbfs@02920@rarrc@02933@rarrfs@0291E@rarrhk@021AA@rarrlp@021AC@rarrpl@02945@rarrsim@02974@Rarrtl@02916@rarrtl@021A3@rarrw@0219D@rAtail@0291C@ratail@0291A@RBarr@02910@rBarr@0290F@rbarr@0290D@rdca@02937@rdldhar@02969@rdsh@021B3@rfisht@0297D@rHar@02964@rhard@021C1@rharu@021C0@rharul@0296C@rlarr@021C4@rlhar@021CC@roarr@021FE@rrarr@021C9@rsh@021B1@ruluhar@02968@searhk@02925@seArr@021D8@searr@02198@seswar@02929@simrarr@02972@slarr@02190@srarr@02192@swarhk@02926@swArr@021D9@swarr@02199@swnwar@0292A@Uarr@0219F@uArr@021D1@Uarrocir@02949@udarr@021C5@udhar@0296E@ufisht@0297E@uHar@02963@uharl@021BF@uharr@021BE@uuarr@021C8@vArr@021D5@varr@02195@xhArr@027FA@xharr@027F7@xlArr@027F8@xlarr@027F5@xmap@027FC@xrArr@027F9@xrarr@027F6@zigrarr@021DD@ac@0223E@amalg@02A3F@barvee@022BD@Barwed@02306@barwed@02305@bsolb@029C5@Cap@022D2@capand@02A44@capbrcup@02A49@capcap@02A4B@capcup@02A47@capdot@02A40@ccaps@02A4D@ccups@02A4C@ccupssm@02A50@coprod@02210@Cup@022D3@cupbrcap@02A48@cupcap@02A46@cupcup@02A4A@cupdot@0228D@cupor@02A45@cuvee@022CE@cuwed@022CF@Dagger@02021@dagger@02020@diam@022C4@divonx@022C7@eplus@02A71@hercon@022B9@intcal@022BA@iprod@02A3C@loplus@02A2D@lotimes@02A34@lthree@022CB@ltimes@022C9@midast@0002A@minusb@0229F@minusd@02238@minusdu@02A2A@ncap@02A43@ncup@02A42@oast@0229B@ocir@0229A@odash@0229D@odiv@02A38@odot@02299@odsold@029BC@ofcir@029BF@ogt@029C1@ohbar@029B5@olcir@029BE@olt@029C0@omid@029B6@ominus@02296@opar@029B7@operp@029B9@oplus@02295@osol@02298@Otimes@02A37@otimes@02297@otimesas@02A36@ovbar@0233D@plusacir@02A23@plusb@0229E@pluscir@02A22@plusdo@02214@plusdu@02A25@pluse@02A72@plussim@02A26@plustwo@02A27@prod@0220F@race@029DA@roplus@02A2E@rotimes@02A35@rthree@022CC@rtimes@022CA@sdot@022C5@sdotb@022A1@setmn@02216@simplus@02A24@smashp@02A33@solb@029C4@sqcap@02293@sqcup@02294@ssetmn@02216@sstarf@022C6@subdot@02ABD@sum@02211@supdot@02ABE@timesb@022A0@timesbar@02A31@timesd@02A30@tridot@025EC@triminus@02A3A@triplus@02A39@trisb@029CD@tritime@02A3B@uplus@0228E@veebar@022BB@wedbar@02A5F@wreath@02240@xcap@022C2@xcirc@025EF@xcup@022C3@xdtri@025BD@xodot@02A00@xoplus@02A01@xotime@02A02@xsqcup@02A06@xuplus@02A04@xutri@025B3@xvee@022C1@xwedge@022C0@dlcorn@0231E@drcorn@0231F@gtlPar@02995@langd@02991@lbrke@0298B@lbrksld@0298F@lbrkslu@0298D@lceil@02308@lfloor@0230A@lmoust@023B0@lparlt@02993@ltrPar@02996@rangd@02992@rbrke@0298C@rbrksld@0298E@rbrkslu@02990@rceil@02309@rfloor@0230B@rmoust@023B1@rpargt@02994@ulcorn@0231C@urcorn@0231D@gnap@02A8A@gnE@02269@gne@02A88@gnsim@022E7@lnap@02A89@lnE@02268@lne@02A87@lnsim@022E6@nap@02249@ncong@02247@nequiv@02262@nge@02271@ngsim@02275@ngt@0226F@nle@02270@nlsim@02274@nlt@0226E@nltri@022EA@nltrie@022EC@nmid@02224@npar@02226@npr@02280@nprcue@022E0@nrtri@022EB@nrtrie@022ED@nsc@02281@nsccue@022E1@nsim@02241@nsime@02244@nsmid@02224@nspar@02226@nsqsube@022E2@nsqsupe@022E3@nsub@02284@nsube@02288@nsup@02285@nsupe@02289@ntgl@02279@ntlg@02278@nVDash@022AF@nVdash@022AE@nvDash@022AD@nvdash@022AC@parsim@02AF3@prnap@02AB9@prnE@02AB5@prnsim@022E8@rnmid@02AEE@scnap@02ABA@scnE@02AB6@scnsim@022E9@simne@02246@solbar@0233F@subnE@02ACB@subne@0228A@supnE@02ACC@supne@0228B@ang@02220@ange@029A4@angmsd@02221@angmsdaa@029A8@angmsdab@029A9@angmsdac@029AA@angmsdad@029AB@angmsdae@029AC@angmsdaf@029AD@angmsdag@029AE@angmsdah@029AF@angrtvb@022BE@angrtvbd@0299D@bbrk@023B5@bbrktbrk@023B6@bemptyv@029B0@beth@02136@boxbox@029C9@";
com.wiris.util.xml.WEntities.s2 = "bprime@02035@bsemi@0204F@cemptyv@029B2@cirE@029C3@cirscir@029C2@comp@02201@daleth@02138@demptyv@029B1@ell@02113@empty@02205@emptyv@02205@gimel@02137@iiota@02129@image@02111@imath@00131@jmath@0006A@laemptyv@029B4@lltri@025FA@lrtri@022BF@mho@02127@nexist@02204@oS@024C8@planck@0210F@plankv@0210F@raemptyv@029B3@range@029A5@real@0211C@tbrk@023B4@trpezium@0FFFD@ultri@025F8@urtri@025F9@vzigzag@0299A@weierp@02118@apE@02A70@ape@0224A@apid@0224B@asymp@02248@Barv@02AE7@bcong@0224C@bepsi@003F6@bowtie@022C8@bsim@0223D@bsime@022CD@bump@0224E@bumpE@02AAE@bumpe@0224F@cire@02257@Colon@02237@Colone@02A74@colone@02254@congdot@02A6D@csub@02ACF@csube@02AD1@csup@02AD0@csupe@02AD2@cuepr@022DE@cuesc@022DF@Dashv@02AE4@dashv@022A3@easter@02A6E@ecir@02256@ecolon@02255@eDDot@02A77@eDot@02251@efDot@02252@eg@02A9A@egs@02A96@egsdot@02A98@el@02A99@els@02A95@elsdot@02A97@equest@0225F@equivDD@02A78@erDot@02253@esdot@02250@Esim@02A73@esim@02242@fork@022D4@forkv@02AD9@frown@02322@gap@02A86@gE@02267@gEl@02A8C@gel@022DB@ges@02A7E@gescc@02AA9@gesdot@02A80@gesdoto@02A82@gesdotol@02A84@gesles@02A94@Gg@022D9@gl@02277@gla@02AA5@glE@02A92@glj@02AA4@gsim@02273@gsime@02A8E@gsiml@02A90@Gt@0226B@gtcc@02AA7@gtcir@02A7A@gtdot@022D7@gtquest@02A7C@gtrarr@02978@homtht@0223B@lap@02A85@lat@02AAB@late@02AAD@lE@02266@lEg@02A8B@leg@022DA@les@02A7D@lescc@02AA8@lesdot@02A7F@lesdoto@02A81@lesdotor@02A83@lesges@02A93@lg@02276@lgE@02A91@Ll@022D8@lsim@02272@lsime@02A8D@lsimg@02A8F@Lt@0226A@ltcc@02AA6@ltcir@02A79@ltdot@022D6@ltlarr@02976@ltquest@02A7B@ltrie@022B4@mcomma@02A29@mDDot@0223A@mid@02223@mlcp@02ADB@models@022A7@mstpos@0223E@Pr@02ABB@pr@0227A@prap@02AB7@prcue@0227C@prE@02AB3@pre@02AAF@prsim@0227E@prurel@022B0@ratio@02236@rtrie@022B5@rtriltri@029CE@Sc@02ABC@sc@0227B@scap@02AB8@sccue@0227D@scE@02AB4@sce@02AB0@scsim@0227F@sdote@02A66@sfrown@02322@simg@02A9E@simgE@02AA0@siml@02A9D@simlE@02A9F@smid@02223@smile@02323@smt@02AAA@smte@02AAC@spar@02225@sqsub@0228F@sqsube@02291@sqsup@02290@sqsupe@02292@ssmile@02323@Sub@022D0@subE@02AC5@subedot@02AC3@submult@02AC1@subplus@02ABF@subrarr@02979@subsim@02AC7@subsub@02AD5@subsup@02AD3@Sup@022D1@supdsub@02AD8@supE@02AC6@supedot@02AC4@suphsub@02AD7@suplarr@0297B@supmult@02AC2@supplus@02AC0@supsim@02AC8@supsub@02AD4@supsup@02AD6@thkap@02248@thksim@0223C@topfork@02ADA@trie@0225C@twixt@0226C@Vbar@02AEB@vBar@02AE8@vBarv@02AE9@VDash@022AB@Vdash@022A9@vDash@022A8@vdash@022A2@Vdashl@02AE6@vltri@022B2@vprop@0221D@vrtri@022B3@Vvdash@022AA@alpha@003B1@beta@003B2@chi@003C7@Delta@00394@delta@003B4@epsi@003B5@epsiv@003F5@eta@003B7@Gamma@00393@gamma@003B3@Gammad@003DC@gammad@003DD@iota@003B9@kappa@003BA@kappav@003F0@Lambda@0039B@lambda@003BB@mu@003BC@nu@003BD@Omega@003A9@omega@003C9@Phi@003A6@phi@003C6@phiv@003D5@Pi@003A0@pi@003C0@piv@003D6@Psi@003A8@psi@003C8@rho@003C1@rhov@003F1@Sigma@003A3@sigma@003C3@sigmav@003C2@tau@003C4@Theta@00398@theta@003B8@thetav@003D1@Upsi@003D2@upsi@003C5@Xi@0039E@xi@003BE@zeta@003B6@Cfr@0212D@Hfr@0210C@Ifr@02111@Rfr@0211C@Zfr@02128@Copf@02102@Hopf@0210D@Nopf@02115@Popf@02119@Qopf@0211A@Ropf@0211D@Zopf@02124@acd@0223F@aleph@02135@And@02A53@and@02227@andand@02A55@andd@02A5C@andslope@02A58@andv@02A5A@angrt@0221F@angsph@02222@angst@0212B@ap@02248@apacir@02A6F@awconint@02233@awint@02A11@becaus@02235@bernou@0212C@bNot@02AED@bnot@02310@bottom@022A5@cap@02229@Cconint@02230@cirfnint@02A10@compfn@02218@cong@02245@Conint@0222F@conint@0222E@ctdot@022EF@cup@0222A@cwconint@02232@cwint@02231@cylcty@0232D@disin@022F2@Dot@000A8@DotDot@020DC@dsol@029F6@dtdot@022F1@dwangle@029A6@elinters@0FFFD@epar@022D5@eparsl@029E3@equiv@02261@eqvparsl@029E5@exist@02203@fltns@025B1@fnof@00192@forall@02200@fpartint@02A0D@ge@02265@hamilt@0210B@iff@021D4@iinfin@029DC@imped@001B5@infin@0221E@infintie@029DD@Int@0222C@int@0222B@intlarhk@02A17@isin@02208@isindot@022F5@isinE@022F9@isins@022F4@isinsv@022F3@isinv@02208@lagran@02112@Lang@0300A@lang@027e8@lArr@021D0@lbbrk@03014@le@02264@loang@03018@lobrk@0301A@lopar@02985@lowast@02217@minus@02212@mnplus@02213@nabla@02207@ne@02260@nhpar@02AF2@ni@0220B@nis@022FC@nisd@022FA@niv@0220B@Not@02AEC@notin@02209@notinva@02209@notinvb@022F7@notinvc@022F6@notni@0220C@notniva@0220C@notnivb@022FE@notnivc@022FD@npolint@02A14@nvinfin@029DE@olcross@029BB@Or@02A54@or@02228@ord@02A5D@order@02134@oror@02A56@orslope@02A57@orv@02A5B@par@02225@parsl@02AFD@part@02202@permil@02030@perp@022A5@pertenk@02031@phmmat@02133@pointint@02A15@Prime@02033@prime@02032@profalar@0232E@profline@02312@profsurf@02313@prop@0221D@qint@02A0C@qprime@02057@quatint@02A16@radic@0221A@Rang@0300B@rang@027e9@rArr@021D2@rbbrk@03015@roang@03019@robrk@0301B@ropar@02986@rppolint@02A12@scpolint@02A13@sim@0223C@simdot@02A6A@sime@02243@smeparsl@029E4@square@025A1@squarf@025AA@strns@000AF@sub@02282@sube@02286@sup@02283@supe@02287@tdot@020DB@there4@02234@tint@0222D@top@022A4@topbot@02336@topcir@02AF1@tprime@02034@utdot@022F0@uwangle@029A7@vangrt@0299C@veeeq@0225A@Verbar@02016@wedgeq@02259@xnis@022FB@angle@02220@ApplyFunction@02061@approx@02248@approxeq@0224A@Assign@02254@backcong@0224C@backepsilon@003F6@backprime@02035@backsim@0223D@backsimeq@022CD@Backslash@02216@barwedge@02305@Because@02235@because@02235@Bernoullis@0212C@between@0226C@bigcap@022C2@bigcirc@025EF@bigcup@022C3@bigodot@02A00@bigoplus@02A01@bigotimes@02A02@bigsqcup@02A06@bigstar@02605@bigtriangledown@025BD@bigtriangleup@025B3@biguplus@02A04@bigvee@022C1@bigwedge@022C0@bkarow@0290D@blacklozenge@029EB@blacksquare@025AA@blacktriangle@025B4@blacktriangledown@025BE@blacktriangleleft@025C2@blacktriangleright@025B8@bot@022A5@boxminus@0229F@boxplus@0229E@boxtimes@022A0@Breve@002D8@bullet@02022@Bumpeq@0224E@bumpeq@0224F@CapitalDifferentialD@02145@Cayleys@0212D@Cedilla@000B8@CenterDot@000B7@centerdot@000B7@checkmark@02713@circeq@02257@circlearrowleft@021BA@circlearrowright@021BB@circledast@0229B@circledcirc@0229A@circleddash@0229D@CircleDot@02299@circledR@000AE@circledS@024C8@CircleMinus@02296@CirclePlus@02295@CircleTimes@02297@ClockwiseContourIntegral@02232@CloseCurlyDoubleQuote@0201D@CloseCurlyQuote@02019@clubsuit@02663@coloneq@02254@complement@02201@complexes@02102@Congruent@02261@ContourIntegral@0222E@Coproduct@02210@CounterClockwiseContourIntegral@02233@CupCap@0224D@curlyeqprec@022DE@curlyeqsucc@022DF@curlyvee@022CE@curlywedge@022CF@curvearrowleft@021B6@curvearrowright@021B7@dbkarow@0290F@ddagger@02021@ddotseq@02A77@Del@02207@DiacriticalAcute@000B4@DiacriticalDot@002D9@DiacriticalDoubleAcute@002DD@DiacriticalGrave@00060@DiacriticalTilde@002DC@Diamond@022C4@diamond@022C4@diamondsuit@02666@DifferentialD@02146@digamma@003DD@div@000F7@divideontimes@022C7@doteq@02250@doteqdot@02251@DotEqual@02250@dotminus@02238@dotplus@02214@dotsquare@022A1@doublebarwedge@02306@DoubleContourIntegral@0222F@DoubleDot@000A8@DoubleDownArrow@021D3@DoubleLeftArrow@021D0@DoubleLeftRightArrow@021D4@DoubleLeftTee@02AE4@DoubleLongLeftArrow@027F8@DoubleLongLeftRightArrow@027FA@DoubleLongRightArrow@027F9@DoubleRightArrow@021D2@DoubleRightTee@022A8@DoubleUpArrow@021D1@DoubleUpDownArrow@021D5@DoubleVerticalBar@02225@DownArrow@02193@Downarrow@021D3@downarrow@02193@DownArrowUpArrow@021F5@downdownarrows@021CA@downharpoonleft@021C3@downharpoonright@021C2@DownLeftVector@021BD@DownRightVector@021C1@DownTee@022A4@DownTeeArrow@021A7@drbkarow@02910@Element@02208@emptyset@02205@eqcirc@02256@eqcolon@02255@eqsim@02242@eqslantgtr@02A96@eqslantless@02A95@EqualTilde@02242@Equilibrium@021CC@Exists@02203@expectation@02130@ExponentialE@02147@exponentiale@02147@fallingdotseq@02252@ForAll@02200@Fouriertrf@02131@geq@02265@geqq@02267@geqslant@02A7E@gg@0226B@ggg@022D9@gnapprox@02A8A@gneq@02A88@gneqq@02269@GreaterEqual@02265@GreaterEqualLess@022DB@GreaterFullEqual@02267@GreaterLess@02277@GreaterSlantEqual@02A7E@GreaterTilde@02273@gtrapprox@02A86@gtrdot@022D7@gtreqless@022DB@gtreqqless@02A8C@gtrless@02277@gtrsim@02273@Hacek@002C7@hbar@0210F@heartsuit@02665@HilbertSpace@0210B@hksearow@02925@hkswarow@02926@hookleftarrow@021A9@hookrightarrow@021AA@hslash@0210F@HumpDownHump@0224E@HumpEqual@0224F@iiiint@02A0C@iiint@0222D@Im@02111@ImaginaryI@02148@imagline@02110@imagpart@02111@Implies@021D2@in@02208@integers@02124@Integral@0222B@intercal@022BA@Intersection@022C2@intprod@02A3C@InvisibleComma@02063@InvisibleTimes@02062@langle@027e8@Laplacetrf@02112@lbrace@0007B@lbrack@0005B@LeftAngleBracket@027e8@LeftArrow@02190@Leftarrow@021D0@leftarrow@02190@LeftArrowBar@021E4@LeftArrowRightArrow@021C6@leftarrowtail@021A2@LeftCeiling@02308@LeftDoubleBracket@0301A@LeftDownVector@021C3@LeftFloor@0230A@leftharpoondown@021BD@leftharpoonup@021BC@leftleftarrows@021C7@LeftRightArrow@02194@Leftrightarrow@021D4@leftrightarrow@02194@leftrightarrows@021C6@leftrightharpoons@021CB@leftrightsquigarrow@021AD@LeftTee@022A3@LeftTeeArrow@021A4@leftthreetimes@022CB@LeftTriangle@022B2@LeftTriangleEqual@022B4@LeftUpVector@021BF@LeftVector@021BC@leq@02264@leqq@02266@leqslant@02A7D@lessapprox@02A85@lessdot@022D6@lesseqgtr@022DA@lesseqqgtr@02A8B@LessEqualGreater@022DA@LessFullEqual@02266@LessGreater@02276@lessgtr@02276@lesssim@02272@LessSlantEqual@02A7D@LessTilde@02272@ll@0226A@llcorner@0231E@Lleftarrow@021DA@lmoustache@023B0@lnapprox@02A89@lneq@02A87@lneqq@02268@LongLeftArrow@027F5@Longleftarrow@027F8@longleftarrow@027F5@LongLeftRightArrow@027F7@Longleftrightarrow@027FA@longleftrightarrow@027F7@longmapsto@027FC@LongRightArrow@027F6@Longrightarrow@027F9@longrightarrow@027F6@looparrowleft@021AB@looparrowright@021AC@LowerLeftArrow@02199@LowerRightArrow@02198@lozenge@025CA@lrcorner@0231F@Lsh@021B0@maltese@02720@mapsto@021A6@measuredangle@02221@Mellintrf@02133@MinusPlus@02213@mp@02213@multimap@022B8@napprox@02249@natural@0266E@naturals@02115@nearrow@02197@NegativeMediumSpace@0200B@NegativeThickSpace@0200B@NegativeThinSpace@0200B@NegativeVeryThinSpace@0200B@NestedGreaterGreater@0226B@NestedLessLess@0226A@nexists@02204@ngeq@02271@ngtr@0226F@nLeftarrow@021CD@nleftarrow@0219A@nLeftrightarrow@021CE@nleftrightarrow@021AE@nleq@02270@nless@0226E@NonBreakingSpace@000A0@NotCongruent@02262@NotDoubleVerticalBar@02226@NotElement@02209@NotEqual@02260@NotExists@02204@NotGreater@0226F@NotGreaterEqual@02271@NotGreaterLess@02279@NotGreaterTilde@02275@NotLeftTriangle@022EA@NotLeftTriangleEqual@022EC@NotLess@0226E@NotLessEqual@02270@NotLessGreater@02278@NotLessTilde@02274@NotPrecedes@02280@NotPrecedesSlantEqual@022E0@NotReverseElement@0220C@NotRightTriangle@022EB@NotRightTriangleEqual@022ED@NotSquareSubsetEqual@022E2@NotSquareSupersetEqual@022E3@NotSubsetEqual@02288@NotSucceeds@02281@NotSucceedsSlantEqual@022E1@NotSupersetEqual@02289@NotTilde@02241@NotTildeEqual@02244@NotTildeFullEqual@02247@NotTildeTilde@02249@NotVerticalBar@02224@nparallel@02226@nprec@02280@nRightarrow@021CF@nrightarrow@0219B@nshortmid@02224@nshortparallel@02226@nsimeq@02244@nsubseteq@02288@nsucc@02281@nsupseteq@02289@ntriangleleft@022EA@ntrianglelefteq@022EC@ntriangleright@022EB@ntrianglerighteq@022ED@nwarrow@02196@oint@0222E@OpenCurlyDoubleQuote@0201C@OpenCurlyQuote@02018@orderof@02134@parallel@02225@PartialD@02202@pitchfork@022D4@PlusMinus@000B1@pm@000B1@Poincareplane@0210C@prec@0227A@precapprox@02AB7@preccurlyeq@0227C@Precedes@0227A@PrecedesEqual@02AAF@PrecedesSlantEqual@0227C@PrecedesTilde@0227E@preceq@02AAF@precnapprox@02AB9@precneqq@02AB5@precnsim@022E8@precsim@0227E@primes@02119@Proportion@02237@Proportional@0221D@propto@0221D@quaternions@0210D@questeq@0225F@rangle@027e9@rationals@0211A@rbrace@0007D@rbrack@0005D@Re@0211C@realine@0211B@realpart@0211C@reals@0211D@ReverseElement@0220B@ReverseEquilibrium@021CB@ReverseUpEquilibrium@0296F@RightAngleBracket@027e9@RightArrow@02192@Rightarrow@021D2@rightarrow@02192@RightArrowBar@021E5@RightArrowLeftArrow@021C4@rightarrowtail@021A3@RightCeiling@02309@RightDoubleBracket@0301B@RightDownVector@021C2@RightFloor@0230B@rightharpoondown@021C1@rightharpoonup@021C0@rightleftarrows@021C4@rightleftharpoons@021CC@rightrightarrows@021C9@rightsquigarrow@0219D@RightTee@022A2@RightTeeArrow@021A6@rightthreetimes@022CC@RightTriangle@022B3@RightTriangleEqual@022B5@RightUpVector@021BE@RightVector@021C0@risingdotseq@02253@rmoustache@023B1@Rrightarrow@021DB@Rsh@021B1@searrow@02198@setminus@02216@ShortDownArrow@02193@ShortLeftArrow@02190@shortmid@02223@shortparallel@02225@ShortRightArrow@02192@ShortUpArrow@02191@simeq@02243@SmallCircle@02218@smallsetminus@02216@spadesuit@02660@Sqrt@0221A@sqsubset@0228F@sqsubseteq@02291@sqsupset@02290@sqsupseteq@02292@Square@025A1@SquareIntersection@02293@SquareSubset@0228F@SquareSubsetEqual@02291@SquareSuperset@02290@SquareSupersetEqual@02292@SquareUnion@02294@Star@022C6@straightepsilon@003F5@straightphi@003D5@Subset@022D0@subset@02282@subseteq@02286@subseteqq@02AC5@SubsetEqual@02286@subsetneq@0228A@subsetneqq@02ACB@succ@0227B@succapprox@02AB8@succcurlyeq@0227D@Succeeds@0227B@SucceedsEqual@02AB0@SucceedsSlantEqual@0227D@SucceedsTilde@0227F@succeq@02AB0@succnapprox@02ABA@succneqq@02AB6@succnsim@022E9@succsim@0227F@SuchThat@0220B@Sum@02211@Superset@02283@SupersetEqual@02287@Supset@022D1@supset@02283@supseteq@02287@supseteqq@02AC6@supsetneq@0228B@supsetneqq@02ACC@swarrow@02199@Therefore@02234@therefore@02234@thickapprox@02248@thicksim@0223C@ThinSpace@02009@Tilde@0223C@TildeEqual@02243@TildeFullEqual@02245@TildeTilde@02248@toea@02928@tosa@02929@triangle@025B5@triangledown@025BF@triangleleft@025C3@trianglelefteq@022B4@triangleq@0225C@triangleright@025B9@trianglerighteq@022B5@TripleDot@020DB@twoheadleftarrow@0219E@twoheadrightarrow@021A0@ulcorner@0231C@Union@022C3@UnionPlus@0228E@UpArrow@02191@Uparrow@021D1@uparrow@02191@UpArrowDownArrow@021C5@UpDownArrow@02195@Updownarrow@021D5@updownarrow@02195@UpEquilibrium@0296E@upharpoonleft@021BF@upharpoonright@021BE@UpperLeftArrow@02196@UpperRightArrow@02197@upsilon@003C5@UpTee@022A5@UpTeeArrow@021A5@upuparrows@021C8@urcorner@0231D@varepsilon@003F5@varkappa@003F0@varnothing@02205@varphi@003C6@varpi@003D6@varpropto@0221D@varrho@003F1@varsigma@003C2@vartheta@003D1@vartriangleleft@022B2@vartriangleright@022B3@Vee@022C1@vee@02228@Vert@02016@vert@0007C@VerticalBar@02223@VerticalTilde@02240@VeryThinSpace@0200A@Wedge@022C0@wedge@02227@wp@02118@wr@02240@zeetrf@02128@af@02061@asympeq@0224D@Cross@02A2F@DD@02145@dd@02146@DownArrowBar@02913@DownBreve@00311@DownLeftRightVector@02950@DownLeftTeeVector@0295E@DownLeftVectorBar@02956@DownRightTeeVector@0295F@DownRightVectorBar@02957@ee@02147@EmptySmallSquare@025FB@EmptyVerySmallSquare@025AB@Equal@02A75@FilledSmallSquare@025FC@FilledVerySmallSquare@025AA@GreaterGreater@02AA2@Hat@0005E@HorizontalLine@02500@ic@02063@ii@02148@it@02062@larrb@021E4@LeftDownTeeVector@02961@LeftDownVectorBar@02959@LeftRightVector@0294E@LeftTeeVector@0295A@LeftTriangleBar@029CF@LeftUpDownVector@02951@LeftUpTeeVector@02960@LeftUpVectorBar@02958@LeftVectorBar@02952@LessLess@02AA1@mapstodown@021A7@mapstoleft@021A4@mapstoup@021A5@MediumSpace@0205F@NewLine@0000A@NoBreak@02060@NotCupCap@0226D@OverBar@000AF@OverBrace@023DE@OverBracket@023B4@OverParenthesis@023DC@planckh@0210E@Product@0220F@rarrb@021E5@RightDownTeeVector@0295D@RightDownVectorBar@02955@RightTeeVector@0295B@RightTriangleBar@029D0@RightUpDownVector@0294F@RightUpTeeVector@0295C@RightUpVectorBar@02954@RightVectorBar@02953@RoundImplies@02970@RuleDelayed@029F4@Tab@00009@UnderBar@00332@UnderBrace@023DF@UnderBracket@023B5@UnderParenthesis@023DD@UpArrowBar@02912@Upsilon@003A5@VerticalLine@0007C@VerticalSeparator@02758@ZeroWidthSpace@0200B@omicron@003BF@amalg@02210@NegativeThinSpace@0E000@";
com.wiris.util.xml.WEntities.oldWebeq = "infty@221e@partial@2202@iint@222c@neq@2260@nsubset@2284@nsupset@2285@exists@2203@ldots@2026@vdots@22ee@cdots@22ef@ddots@22f1@bar@00af@hat@005e@vec@21c0@ddot@00A8@";
com.wiris.util.xml.WEntities.MATHML_ENTITIES = com.wiris.util.xml.WEntities.s1 + com.wiris.util.xml.WEntities.s2 + com.wiris.util.xml.WEntities.oldWebeq;
haxe.Unserializer.DEFAULT_RESOLVER = Type;
haxe.Unserializer.BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789%:";
haxe.Unserializer.CODES = null;
js.Lib.onerror = null;

com.wiris.system.ResourceLoader.charactersDefinition = '<characters><char c="65535" t="b"/><char c="0" t="b"/><char c="32" t="b"/><char c="9115" t="b"/><char c="9116" t="b"/><char c="9117" t="b"/><char c="9118" t="b"/><char c="9119" t="b"/><char c="9120" t="b"/><char c="9121" t="b"/><char c="9122" t="b"/><char c="9123" t="b"/><char c="9124" t="b"/><char c="9125" t="b"/><char c="9126" t="b"/><char c="61442" t="b"/><char c="62466" t="b"/><char c="62467" t="b"/><char c="65535" t="s"/><char c="32" t="s"/><char c="9115" t="s"/><char c="9116" t="s"/><char c="9117" t="s"/><char c="9118" t="s"/><char c="9119" t="s"/><char c="9120" t="s"/><char c="9121" t="s"/><char c="9122" t="s"/><char c="9123" t="s"/><char c="9124" t="s"/><char c="9125" t="s"/><char c="9126" t="s"/><char c="9127" t="s"/><char c="9128" t="s"/><char c="9129" t="s"/><char c="9130" t="s"/><char c="9131" t="s"/><char c="9132" t="s"/><char c="9133" t="s"/><char c="9134" t="s"/><char c="9168" t="s"/><char c="61442" t="s"/><char c="62464" t="s"/><char c="62465" t="s"/><char c="62466" t="s"/><char c="62467" t="s"/><char c="65535" t="m"/><char c="0" t="m"/><char c="32" t="m"/><char c="39" t="m"/><char c="43" t="m"/><char c="45" t="m"/><char c="46" t="m"/><char c="47" t="m"/><char c="60" t="m"/><char c="61" t="m"/><char c="62" t="m"/><char c="160" t="m"/><char c="172" t="m"/><char c="176" t="m"/><char c="177" t="m"/><char c="183" t="m"/><char c="215" t="m"/><char c="247" t="m"/><char c="437" t="m"/><char c="729" t="m"/><char c="960" t="m"/><char c="4096" t="m"/><char c="8201" t="m"/><char c="8229" t="m"/><char c="8230" t="m"/><char c="8245" t="m"/><char c="8450" t="m"/><char c="8465" t="m"/><char c="8466" t="m"/><char c="8467" t="m"/><char c="8469" t="m"/><char c="8472" t="m"/><char c="8473" t="m"/><char c="8474" t="m"/><char c="8476" t="m"/><char c="8477" t="m"/><char c="8484" t="m"/><char c="8497" t="m"/><char c="8501" t="m"/><char c="8592" t="m"/><char c="8593" t="m"/><char c="8594" t="m"/><char c="8595" t="m"/><char c="8596" t="m"/><char c="8597" t="m"/><char c="8612" t="m"/><char c="8614" t="m"/><char c="8617" t="m"/><char c="8618" t="m"/><char c="8629" t="m"/><char c="8636" t="m"/><char c="8640" t="m"/><char c="8656" t="m"/><char c="8657" t="m"/><char c="8658" t="m"/><char c="8659" t="m"/><char c="8660" t="m"/><char c="8661" t="m"/><char c="8704" t="m"/><char c="8706" t="m"/><char c="8707" t="m"/><char c="8708" t="m"/><char c="8709" t="m"/><char c="8710" t="m"/><char c="8711" t="m"/><char c="8712" t="m"/><char c="8713" t="m"/><char c="8715" t="m"/><char c="8716" t="m"/><char c="8719" t="m"/><char c="8720" t="m"/><char c="8721" t="m"/><char c="8722" t="m"/><char c="8723" t="m"/><char c="8726" t="m"/><char c="8727" t="m"/><char c="8728" t="m"/><char c="8729" t="m"/><char c="8733" t="m"/><char c="8734" t="m"/><char c="8736" t="m"/><char c="8737" t="m"/><char c="8738" t="m"/><char c="8741" t="m"/><char c="8742" t="m"/><char c="8743" t="m"/><char c="8744" t="m"/><char c="8745" t="m"/><char c="8746" t="m"/><char c="8747" t="m"/><char c="8748" t="m"/><char c="8749" t="m"/><char c="8750" t="m"/><char c="8751" t="m"/><char c="8752" t="m"/><char c="8756" t="m"/><char c="8757" t="m"/><char c="8764" t="m"/><char c="8765" t="m"/><char c="8769" t="m"/><char c="8771" t="m"/><char c="8773" t="m"/><char c="8776" t="m"/><char c="8800" t="m"/><char c="8801" t="m"/><char c="8802" t="m"/><char c="8804" t="m"/><char c="8805" t="m"/><char c="8810" t="m"/><char c="8811" t="m"/><char c="8826" t="m"/><char c="8827" t="m"/><char c="8834" t="m"/><char c="8835" t="m"/><char c="8838" t="m"/><char c="8839" t="m"/><char c="8847" t="m"/><char c="8848" t="m"/><char c="8849" t="m"/><char c="8850" t="m"/><char c="8851" t="m"/><char c="8852" t="m"/><char c="8853" t="m"/><char c="8855" t="m"/><char c="8857" t="m"/><char c="8859" t="m"/><char c="8861" t="m"/><char c="8869" t="m"/><char c="8882" t="m"/><char c="8883" t="m"/><char c="8900" t="m"/><char c="8909" t="m"/><char c="8942" t="m"/><char c="8943" t="m"/><char c="8944" t="m"/><char c="8945" t="m"/><char c="9135" t="m"/><char c="9633" t="m"/><char c="9649" t="m"/><char c="9651" t="m"/><char c="9675" t="m"/><char c="10602" t="m"/><char c="10605" t="m"/><char c="10808" t="m"/><char c="10877" t="m"/><char c="10878" t="m"/><char c="10887" t="m"/><char c="10888" t="m"/><char c="12288" t="m"/><char c="12289" t="m"/><char c="57358" t="m"/><char c="61442" t="m"/><char c="65535" t="r"/><char c="32" t="r"/><char c="8706" t="r"/><char c="8707" t="r"/><char c="8708" t="r"/><char c="8721" t="r"/><char c="8726" t="r"/><char c="8733" t="r"/><char c="8736" t="r"/><char c="8737" t="r"/><char c="8738" t="r"/><char c="8742" t="r"/><char c="8747" t="r"/><char c="8748" t="r"/><char c="8749" t="r"/><char c="8750" t="r"/><char c="8751" t="r"/><char c="8752" t="r"/><char c="8769" t="r"/><char c="8773" t="r"/><char c="8776" t="r"/><char c="8800" t="r"/><char c="8802" t="r"/><char c="10887" t="r"/><char c="10888" t="r"/><char c="61442" t="r"/><char c="65535" t="h"/><char c="9135" t="h"/><char c="61442" t="h"/><char c="61443" t="h"/><char c="61952" t="h"/><char c="61953" t="h"/><char c="61954" t="h"/><char c="61955" t="h"/><char c="61956" t="h"/><char c="61957" t="h"/><char c="61958" t="h"/><char c="61959" t="h"/><char c="61960" t="h"/><char c="61961" t="h"/><char c="61962" t="h"/><char c="61963" t="h"/><char c="61964" t="h"/><char c="61965" t="h"/><char c="61966" t="h"/><char c="62208" t="h"/><char c="62209" t="h"/><char c="62210" t="h"/><char c="62211" t="h"/><char c="62212" t="h"/><char c="62213" t="h"/><char c="62214" t="h"/><char c="62215" t="h"/><char c="62216" t="h"/><char c="62217" t="h"/><char c="62218" t="h"/><char c="62219" t="h"/><char c="62220" t="h"/><char c="62221" t="h"/><char c="65535" t="a"/><char c="0" t="a"/><char c="32" t="a"/><char c="97" t="a"/><char c="102" t="a"/><char c="61442" t="a"/></characters>';delete Array.prototype.__class__;